├── .gitignore ├── README.md ├── index.js ├── package-lock.json ├── package.json ├── res └── input.txt ├── src ├── array │ ├── combinationSum.js │ ├── findKthLargest.js │ ├── isPalindrome.js │ ├── maxArea.js │ ├── merge.js │ ├── minSubArrayLen.js │ ├── moveZeroes.js │ ├── removeDuplicates.js │ ├── removeElement.js │ ├── reverseVowels.js │ ├── sortColors.js │ └── twoSum.JS ├── dataStructure │ ├── DoublyLink.js │ ├── Graph.js │ ├── Heap.js │ ├── MinStack.js │ ├── MyCircularQueue.js │ ├── Queue.js │ ├── Stack.js │ ├── link │ │ ├── ListNode.js │ │ ├── hasCycle.js │ │ ├── hasCycle.test.js │ │ ├── kthToLast.js │ │ ├── kthToLast.test.js │ │ ├── mergeTwoLists.js │ │ └── reversalLinked.js │ └── tree │ │ ├── buildTree.js │ │ ├── connect.js │ │ ├── hasPathSum.js │ │ ├── inorderTraversal.js │ │ ├── isSymmetric.js │ │ ├── levelOrder.js │ │ ├── maxDepth.js │ │ ├── postorderTraversal.js │ │ ├── preorderTraversal.js │ │ └── serialize.js ├── dynamicPlanning │ ├── first.js │ └── jumpFloor.js ├── graph │ ├── dijkstra.js │ └── topoSort.js ├── js │ ├── curry.js │ └── deepClone.js ├── leetcode │ ├── 1.two-sum.js │ ├── 15.threeSum.js │ ├── 169.majorityElement.js │ ├── 2.add-to-numbers.js │ ├── 278.isBadVersion.js │ ├── 33.search.js │ ├── cloneGraph.js │ ├── dailyTemperatures.js │ ├── decodeString.js │ ├── evalRPN.js │ ├── faibonacci.js │ ├── findPeakElement.js │ ├── floodFill.js │ ├── getLeaves.js │ ├── inorderTraversal.js │ ├── isValid.js │ ├── mySqrt.js │ ├── numIslands.js │ ├── numSquares.js │ ├── openLock.js │ ├── sameTree.js │ ├── search.js │ ├── searchMatrix.js │ ├── singleNumber.js │ └── updateMatrix.js └── sort │ ├── bubbleSort.js │ ├── index.js │ ├── insertSort.js │ ├── quickSort.js │ └── selectSort.js ├── test ├── doublyLink_test.js ├── mergeTwoLists_test.js └── stack_test.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # algorithm 2 | 基于js实现各类算法 3 | 4 | ## 排序 5 | 1. 选择排序 selectSort 6 | 2. 冒泡排序 bubbleSort 7 | 3. 插入排序 insertSort 8 | 4. 快速排序 quickSort -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cuixiaorui/algorithm/241b4be6f1d4089307c82d7de3d89b464be63bfc/index.js -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "requires": true, 3 | "lockfileVersion": 1, 4 | "dependencies": { 5 | "acorn": { 6 | "version": "5.7.3", 7 | "resolved": "http://registry.npm.taobao.org/acorn/download/acorn-5.7.3.tgz", 8 | "dev": true 9 | }, 10 | "acorn-es7-plugin": { 11 | "version": "1.1.7", 12 | "resolved": "http://registry.npm.taobao.org/acorn-es7-plugin/download/acorn-es7-plugin-1.1.7.tgz", 13 | "dev": true 14 | }, 15 | "array-filter": { 16 | "version": "1.0.0", 17 | "resolved": "http://registry.npm.taobao.org/array-filter/download/array-filter-1.0.0.tgz", 18 | "dev": true 19 | }, 20 | "balanced-match": { 21 | "version": "1.0.0", 22 | "resolved": "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", 23 | "dev": true 24 | }, 25 | "brace-expansion": { 26 | "version": "1.1.11", 27 | "resolved": "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz", 28 | "dev": true, 29 | "requires": { 30 | "balanced-match": "^1.0.0" 31 | }, 32 | "dependencies": { 33 | "balanced-match": { 34 | "version": "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", 35 | "bundled": true 36 | }, 37 | "concat-map": { 38 | "version": "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", 39 | "bundled": true 40 | } 41 | } 42 | }, 43 | "browser-stdout": { 44 | "version": "1.3.1", 45 | "resolved": "http://registry.npm.taobao.org/browser-stdout/download/browser-stdout-1.3.1.tgz", 46 | "dev": true 47 | }, 48 | "commander": { 49 | "version": "2.15.1", 50 | "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.15.1.tgz", 51 | "dev": true 52 | }, 53 | "convert-source-map": { 54 | "version": "1.6.0", 55 | "resolved": "http://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.6.0.tgz", 56 | "dev": true, 57 | "dependencies": { 58 | "safe-buffer": { 59 | "version": "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", 60 | "bundled": true 61 | } 62 | } 63 | }, 64 | "core-js": { 65 | "version": "2.6.1", 66 | "resolved": "http://registry.npm.taobao.org/core-js/download/core-js-2.6.1.tgz", 67 | "dev": true 68 | }, 69 | "debug": { 70 | "version": "3.1.0", 71 | "resolved": "http://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz", 72 | "dev": true, 73 | "dependencies": { 74 | "ms": { 75 | "version": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", 76 | "bundled": true 77 | } 78 | } 79 | }, 80 | "define-properties": { 81 | "version": "1.1.3", 82 | "resolved": "http://registry.npm.taobao.org/define-properties/download/define-properties-1.1.3.tgz", 83 | "dev": true, 84 | "requires": { 85 | "object-keys": "^1.0.12" 86 | }, 87 | "dependencies": { 88 | "object-keys": { 89 | "version": "http://registry.npm.taobao.org/object-keys/download/object-keys-1.0.12.tgz", 90 | "bundled": true 91 | } 92 | } 93 | }, 94 | "diff": { 95 | "version": "3.5.0", 96 | "resolved": "http://registry.npm.taobao.org/diff/download/diff-3.5.0.tgz", 97 | "dev": true 98 | }, 99 | "empower": { 100 | "version": "1.3.1", 101 | "resolved": "http://registry.npm.taobao.org/empower/download/empower-1.3.1.tgz", 102 | "dev": true, 103 | "requires": { 104 | "core-js": "^2.0.0" 105 | }, 106 | "dependencies": { 107 | "core-js": { 108 | "version": "http://registry.npm.taobao.org/core-js/download/core-js-2.6.1.tgz", 109 | "bundled": true 110 | }, 111 | "empower-core": { 112 | "version": "http://registry.npm.taobao.org/empower-core/download/empower-core-1.2.0.tgz", 113 | "bundled": true 114 | } 115 | } 116 | }, 117 | "escape-string-regexp": { 118 | "version": "1.0.5", 119 | "resolved": "http://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz", 120 | "dev": true 121 | }, 122 | "espower-loader": { 123 | "version": "1.2.2", 124 | "resolved": "http://registry.npm.taobao.org/espower-loader/download/espower-loader-1.2.2.tgz", 125 | "dev": true, 126 | "requires": { 127 | "convert-source-map": "^1.1.0", 128 | "minimatch": "^3.0.0", 129 | "xtend": "^4.0.0" 130 | }, 131 | "dependencies": { 132 | "convert-source-map": { 133 | "version": "http://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.6.0.tgz", 134 | "bundled": true 135 | }, 136 | "espower-source": { 137 | "version": "http://registry.npm.taobao.org/espower-source/download/espower-source-2.3.0.tgz", 138 | "bundled": true 139 | }, 140 | "minimatch": { 141 | "version": "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", 142 | "bundled": true, 143 | "dependencies": { 144 | "brace-expansion": { 145 | "version": "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz", 146 | "bundled": true, 147 | "dependencies": { 148 | "balanced-match": { 149 | "version": "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", 150 | "bundled": true 151 | }, 152 | "concat-map": { 153 | "version": "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", 154 | "bundled": true 155 | } 156 | } 157 | } 158 | } 159 | }, 160 | "source-map-support": { 161 | "version": "http://registry.npm.taobao.org/source-map-support/download/source-map-support-0.4.18.tgz", 162 | "bundled": true 163 | }, 164 | "xtend": { 165 | "version": "http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz", 166 | "bundled": true 167 | } 168 | } 169 | }, 170 | "espurify": { 171 | "version": "1.8.1", 172 | "resolved": "http://registry.npm.taobao.org/espurify/download/espurify-1.8.1.tgz", 173 | "dev": true, 174 | "requires": { 175 | "core-js": "^2.0.0" 176 | }, 177 | "dependencies": { 178 | "core-js": { 179 | "version": "http://registry.npm.taobao.org/core-js/download/core-js-2.6.1.tgz", 180 | "bundled": true 181 | } 182 | } 183 | }, 184 | "estraverse": { 185 | "version": "4.2.0", 186 | "resolved": "http://registry.npm.taobao.org/estraverse/download/estraverse-4.2.0.tgz", 187 | "dev": true 188 | }, 189 | "fs.realpath": { 190 | "version": "1.0.0", 191 | "resolved": "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", 192 | "dev": true 193 | }, 194 | "glob": { 195 | "version": "7.1.2", 196 | "resolved": "http://registry.npm.taobao.org/glob/download/glob-7.1.2.tgz", 197 | "dev": true, 198 | "requires": { 199 | "fs.realpath": "^1.0.0", 200 | "minimatch": "^3.0.4" 201 | }, 202 | "dependencies": { 203 | "fs.realpath": { 204 | "version": "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", 205 | "bundled": true 206 | }, 207 | "inflight": { 208 | "version": "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", 209 | "bundled": true 210 | }, 211 | "inherits": { 212 | "version": "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", 213 | "bundled": true 214 | }, 215 | "minimatch": { 216 | "version": "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", 217 | "bundled": true, 218 | "dependencies": { 219 | "brace-expansion": { 220 | "version": "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz", 221 | "bundled": true, 222 | "dependencies": {} 223 | } 224 | } 225 | }, 226 | "once": { 227 | "version": "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz", 228 | "bundled": true, 229 | "dependencies": { 230 | "wrappy": { 231 | "version": "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", 232 | "bundled": true 233 | } 234 | } 235 | }, 236 | "path-is-absolute": { 237 | "version": "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", 238 | "bundled": true 239 | } 240 | } 241 | }, 242 | "growl": { 243 | "version": "1.10.5", 244 | "resolved": "http://registry.npm.taobao.org/growl/download/growl-1.10.5.tgz", 245 | "dev": true 246 | }, 247 | "has-flag": { 248 | "version": "3.0.0", 249 | "resolved": "http://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz", 250 | "dev": true 251 | }, 252 | "he": { 253 | "version": "1.1.1", 254 | "resolved": "http://registry.npm.taobao.org/he/download/he-1.1.1.tgz", 255 | "dev": true 256 | }, 257 | "indexof": { 258 | "version": "0.0.1", 259 | "resolved": "http://registry.npm.taobao.org/indexof/download/indexof-0.0.1.tgz", 260 | "dev": true 261 | }, 262 | "intelli-espower-loader": { 263 | "version": "1.0.1", 264 | "resolved": "https://registry.npmjs.org/intelli-espower-loader/-/intelli-espower-loader-1.0.1.tgz", 265 | "integrity": "sha1-LHsDFGvB1GvyENCgOXxckatMorA=", 266 | "dev": true, 267 | "requires": { 268 | "espower-loader": "^1.0.0" 269 | } 270 | }, 271 | "minimatch": { 272 | "version": "3.0.4", 273 | "resolved": "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", 274 | "dev": true, 275 | "requires": { 276 | "brace-expansion": "^1.1.7" 277 | } 278 | }, 279 | "minimist": { 280 | "version": "0.0.8", 281 | "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz", 282 | "dev": true 283 | }, 284 | "mkdirp": { 285 | "version": "0.5.1", 286 | "resolved": "http://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz", 287 | "dev": true, 288 | "requires": { 289 | "minimist": "0.0.8" 290 | }, 291 | "dependencies": { 292 | "minimist": { 293 | "version": "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz", 294 | "bundled": true 295 | } 296 | } 297 | }, 298 | "mocha": { 299 | "version": "5.2.0", 300 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", 301 | "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", 302 | "dev": true, 303 | "requires": { 304 | "browser-stdout": "1.3.1", 305 | "commander": "2.15.1", 306 | "debug": "3.1.0", 307 | "diff": "3.5.0", 308 | "escape-string-regexp": "1.0.5", 309 | "glob": "7.1.2", 310 | "growl": "1.10.5", 311 | "he": "1.1.1", 312 | "minimatch": "3.0.4", 313 | "mkdirp": "0.5.1", 314 | "supports-color": "5.4.0" 315 | } 316 | }, 317 | "object-keys": { 318 | "version": "1.0.12", 319 | "resolved": "http://registry.npm.taobao.org/object-keys/download/object-keys-1.0.12.tgz", 320 | "dev": true 321 | }, 322 | "power-assert": { 323 | "version": "1.6.1", 324 | "resolved": "https://registry.npmjs.org/power-assert/-/power-assert-1.6.1.tgz", 325 | "integrity": "sha512-VWkkZV6Y+W8qLX/PtJu2Ur2jDPIs0a5vbP0TpKeybNcIXmT4vcKoVkyTp5lnQvTpY/DxacAZ4RZisHRHLJcAZQ==", 326 | "dev": true, 327 | "requires": { 328 | "define-properties": "^1.1.2", 329 | "empower": "^1.3.1", 330 | "power-assert-formatter": "^1.4.1", 331 | "universal-deep-strict-equal": "^1.2.1", 332 | "xtend": "^4.0.0" 333 | } 334 | }, 335 | "power-assert-context-formatter": { 336 | "version": "1.2.0", 337 | "resolved": "http://registry.npm.taobao.org/power-assert-context-formatter/download/power-assert-context-formatter-1.2.0.tgz", 338 | "dev": true, 339 | "requires": { 340 | "core-js": "^2.0.0" 341 | }, 342 | "dependencies": { 343 | "core-js": { 344 | "version": "http://registry.npm.taobao.org/core-js/download/core-js-2.6.1.tgz", 345 | "bundled": true 346 | }, 347 | "power-assert-context-traversal": { 348 | "version": "http://registry.npm.taobao.org/power-assert-context-traversal/download/power-assert-context-traversal-1.2.0.tgz", 349 | "bundled": true 350 | } 351 | } 352 | }, 353 | "power-assert-context-reducer-ast": { 354 | "version": "1.2.0", 355 | "resolved": "http://registry.npm.taobao.org/power-assert-context-reducer-ast/download/power-assert-context-reducer-ast-1.2.0.tgz", 356 | "dev": true, 357 | "requires": { 358 | "acorn": "^5.0.0", 359 | "acorn-es7-plugin": "^1.0.12", 360 | "core-js": "^2.0.0", 361 | "espurify": "^1.6.0", 362 | "estraverse": "^4.2.0" 363 | }, 364 | "dependencies": { 365 | "acorn": { 366 | "version": "http://registry.npm.taobao.org/acorn/download/acorn-5.7.3.tgz", 367 | "bundled": true 368 | }, 369 | "acorn-es7-plugin": { 370 | "version": "http://registry.npm.taobao.org/acorn-es7-plugin/download/acorn-es7-plugin-1.1.7.tgz", 371 | "bundled": true 372 | }, 373 | "core-js": { 374 | "version": "http://registry.npm.taobao.org/core-js/download/core-js-2.6.1.tgz", 375 | "bundled": true 376 | }, 377 | "espurify": { 378 | "version": "http://registry.npm.taobao.org/espurify/download/espurify-1.8.1.tgz", 379 | "bundled": true, 380 | "dependencies": { 381 | "core-js": { 382 | "version": "http://registry.npm.taobao.org/core-js/download/core-js-2.6.1.tgz", 383 | "bundled": true 384 | } 385 | } 386 | }, 387 | "estraverse": { 388 | "version": "http://registry.npm.taobao.org/estraverse/download/estraverse-4.2.0.tgz", 389 | "bundled": true 390 | } 391 | } 392 | }, 393 | "power-assert-formatter": { 394 | "version": "1.4.1", 395 | "resolved": "http://registry.npm.taobao.org/power-assert-formatter/download/power-assert-formatter-1.4.1.tgz", 396 | "dev": true, 397 | "requires": { 398 | "core-js": "^2.0.0", 399 | "power-assert-context-formatter": "^1.0.7", 400 | "power-assert-context-reducer-ast": "^1.0.7" 401 | }, 402 | "dependencies": { 403 | "core-js": { 404 | "version": "http://registry.npm.taobao.org/core-js/download/core-js-2.6.1.tgz", 405 | "bundled": true 406 | }, 407 | "power-assert-context-formatter": { 408 | "version": "http://registry.npm.taobao.org/power-assert-context-formatter/download/power-assert-context-formatter-1.2.0.tgz", 409 | "bundled": true 410 | }, 411 | "power-assert-context-reducer-ast": { 412 | "version": "http://registry.npm.taobao.org/power-assert-context-reducer-ast/download/power-assert-context-reducer-ast-1.2.0.tgz", 413 | "bundled": true 414 | }, 415 | "power-assert-renderer-assertion": { 416 | "version": "http://registry.npm.taobao.org/power-assert-renderer-assertion/download/power-assert-renderer-assertion-1.2.0.tgz", 417 | "bundled": true 418 | }, 419 | "power-assert-renderer-comparison": { 420 | "version": "http://registry.npm.taobao.org/power-assert-renderer-comparison/download/power-assert-renderer-comparison-1.2.0.tgz", 421 | "bundled": true 422 | }, 423 | "power-assert-renderer-diagram": { 424 | "version": "http://registry.npm.taobao.org/power-assert-renderer-diagram/download/power-assert-renderer-diagram-1.2.0.tgz", 425 | "bundled": true 426 | }, 427 | "power-assert-renderer-file": { 428 | "version": "http://registry.npm.taobao.org/power-assert-renderer-file/download/power-assert-renderer-file-1.2.0.tgz", 429 | "bundled": true 430 | } 431 | } 432 | }, 433 | "supports-color": { 434 | "version": "5.4.0", 435 | "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-5.4.0.tgz", 436 | "dev": true, 437 | "requires": { 438 | "has-flag": "^3.0.0" 439 | }, 440 | "dependencies": { 441 | "has-flag": { 442 | "version": "http://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz", 443 | "bundled": true 444 | } 445 | } 446 | }, 447 | "universal-deep-strict-equal": { 448 | "version": "1.2.2", 449 | "resolved": "http://registry.npm.taobao.org/universal-deep-strict-equal/download/universal-deep-strict-equal-1.2.2.tgz", 450 | "dev": true, 451 | "requires": { 452 | "array-filter": "^1.0.0", 453 | "indexof": "0.0.1", 454 | "object-keys": "^1.0.0" 455 | }, 456 | "dependencies": { 457 | "array-filter": { 458 | "version": "http://registry.npm.taobao.org/array-filter/download/array-filter-1.0.0.tgz", 459 | "bundled": true 460 | }, 461 | "indexof": { 462 | "version": "http://registry.npm.taobao.org/indexof/download/indexof-0.0.1.tgz", 463 | "bundled": true 464 | }, 465 | "object-keys": { 466 | "version": "http://registry.npm.taobao.org/object-keys/download/object-keys-1.0.12.tgz", 467 | "bundled": true 468 | } 469 | } 470 | }, 471 | "xtend": { 472 | "version": "4.0.1", 473 | "resolved": "http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz", 474 | "dev": true 475 | } 476 | } 477 | } 478 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "scripts": { 3 | "test": "jest" 4 | }, 5 | "devDependencies": { 6 | "@types/jest": "^27.0.2", 7 | "intelli-espower-loader": "^1.0.1", 8 | "jest": "^27.3.1", 9 | "minimist": "^1.2.0", 10 | "mocha": "^5.2.0", 11 | "power-assert": "^1.6.1" 12 | }, 13 | "name": "algorithm", 14 | "description": "基于js实现各类算法", 15 | "version": "1.0.0", 16 | "main": "index.js", 17 | "directories": { 18 | "test": "test" 19 | }, 20 | "repository": { 21 | "type": "git", 22 | "url": "git+https://github.com/cuixiaorui/algorithm.git" 23 | }, 24 | "author": "", 25 | "license": "ISC", 26 | "bugs": { 27 | "url": "https://github.com/cuixiaorui/algorithm/issues" 28 | }, 29 | "homepage": "https://github.com/cuixiaorui/algorithm#readme" 30 | } 31 | -------------------------------------------------------------------------------- /res/input.txt: -------------------------------------------------------------------------------- 1 | [19223,6301,60965,2038,60962,32876,27071,63859,12679,97992,41263,34316,17064,70727,29790,12863,54112,41389,44159,39136,99847,77314,48509,17633,869,27915,69,3181,65935,49680,98848,1541,94547,81742,3085,1586,8467,31537,1596,84176,92137,10214,31917,82729,28946,53838,56248,35458,67928,90668,19011,65391,49645,94432,28321,58479,31067,98522,58625,53252,87880,3600,37514,84345,67291,49219,4044,84263,36058,50893,13174,11113,4076,65034,30414,51797,39853,61483,8842,30165,60327,76388,74220,50098,21906,66309,52625,48073,41442,6657,44645,94549,93776,48709,10686,86043,13359,33686,69991,83628,49082,19759,15055,52504,48815,42140,39129,87901,13804,31943,25525,75226,90783,79389,21137,66516,97240,49255,73585,31896,43760,62927,67631,95973,73394,63388,12084,24294,71374,82941,14842,30949,66886,90028,55482,60282,42200,89739,38773,8289,75397,52261,56233,59032,88432,66697,38684,17603,42415,37567,40962,65297,36305,94921,25409,68715,99369,63683,7828,80721,31165,56039,5258,46047,33133,1345,9439,13832,63118,94938,36878,62213,69260,35717,91878,29531,26127,91954,67884,71731,52637,86969,25511,9342,46998,46731,92569,80568,4243,44672,21532,15947,47122,4096,6714,83133,50294,33449,47575,21163,12660,17625,50128,29031,30913,46599,57755,13531,83662,45779,38315,50893,38516,8958,14195,95086,14683,48474,87493,19930,74181,87774,28544,32259,89175,246,59535,48972,47851,17234,32396,50212,95839,53896,54304,55621,45875,77801,62721,17260,96160,70377,61042,47473,6003,34780,93160,38174,36242,65462,84894,19931,73333,5837,83158,64726,49095,32786,19026,18314,66531,11413,77501,982,24162,54309,38236,10789,11167,87984,58571,38589,39199,83705,60590,81185,35576,7383,78180,29678,82753,1553,95190,35447,98872,47143,78917,16496,1355,50645,83652,60963,86427,78322,63290,26457,95203,80490,58243,22612,17735,45335,39873,17228,62697,17062,62226,95989,85240,7864,90363,61462,65382,47408,60109,60859,7175,60342,23906,55133,9238,64872,16461,18892,3074,42818,35584,91179,90441,318,45898,6635,50569,87830,93503,38231,19887,28186,55124,17792,31743,87965,33760,84950,90701,96354,28640,21706,27642,32025,71757,33253,85067,42288,60338,92720,43582,52862,59333,61478,2496,27208,14244,44205,27105,28116,55884,25187,90238,79801,32943,95532,87969,93984,54542,36853,98760,72859,44597,80676,4149,70088,31393,57177,18728,86254,69910,93437,58287,81306,19403,99996,89183,24712,54693,3484,89887,24629,8745,58482,84820,22473,95191,31468,26776,3328,3706,22617,10873,47679,71961,7063,25397,39029,73556,99885,9554,57666,80123,86124,17710,22296,84256,32568,5344,95719,59458,59286,15875,80526,10830,27810,53,52442,34374,83719,62680,72590,44629,561,87445,47055,94931,18053,15753,1146,18486,20998,90784,61083,78674,98871,87068,25760,46434,78575,57922,44431,62453,38223,77358,22149,78377,84616,38394,56543,59490,38014,4349,15820,45097,2037,91716,98823,90220,35604,42908,42901,28297,40595,87262,42871,97240,15161,14315,13394,10426,60485,51180,63124,86387,29365,19897,55010,9656,91956,76733,49107,67023,40081,45241,58232,36676,95915,86636,80875,67595,37846,57061,24831,58950,77250,30104,57791,49859,75352,19753,61681,54796,47009,68253,76275,95443,67572,26887,73866,59317,56531,92397,4416,89150,40138,35789,62172,10563,20152,87533,93492,58372,90459,52253,18043,38390,54293,87713,72068,44445,61318,58570,18291,93635,90661,73301,98020,38763,16930,74776,44857,86123,45514,85343,46418,59214,61874,53828,41612,42862,19281,2997,7938,36920,84300,80606,84183,77774,85295,80443,10846,19186,19132,95625,31472,35936,89788,75380,9216,12197,45446,20754,86988,63378,21250,43707,97747,97317,76748,59362,11693,29959,93373,12324,1689,6628,37934,69360,68765,82172,69539,22842,3288,10375,57229,47280,65506,50813,40545,53910,40719,32191,97479,23178,51324,79669,54557,85195,5635,59530,60875,41214,51734,33505,37627,93490,96899,85304,51763,58024,29141,56635,82764,68394,48258,44279,39018,13470,73624,90430,43413,42176,21613,86589,48019,8043,91570,44499,53110,79971,82382,54309,65590,17419,15460,97743,92118,54712,24424,8205,29813,3992,89664,50965,96200,25705,55846,32082,10093,35160,85102,3034,29491,73111,91587,67609,90825,16536,23736,10078,78490,70476,4926,31844,94972,73465,92086,29779,68060,20589,83858,69490,12154,79689,46546,32361,56051,84639,95597,89206,47524,49440,8244,6883,50985,89092,6280,55357,48743,68590,70521,37953,20661,93338,40584,67886,83443,55457,82020,24041,87244,16776,90707,2156,81720,41979,67860,43634,75461,55369,68397,94359,66597,98273,36251,40568,45097,9270,88069,26248,89614,63132,54378,49263,31527,98240,17366,99318,28588,37624,97007,37327,23776,65998,21480,82767,61388,72238,64001,75975,95715,80304,89094,6525,69836,56429,99138,52067,55410,76048,20062,66267,36105,49847,28643,71777,89950,99821,40235,28316,32350,50866,70743,48102,67929,60277,24976,37745,44603,69224,9624,39599,44575,5089,20639,62446,48150,18674,65751,65086,84120,15691,42518,40391,66872,23324,25086,4324,43265,85120,19326,1570,72179,62910,65032,13833,72894,24418,53568,45498,27002,78778,54184,31797,95669,40083,85828,54937,15392,78556,76035,28985,75542,207,56629,518,64843,53939,52934,36520,67865,51220,32264,24626,51678,81911,66215,16978,41129,48711,49909,13397,42355,20298,38838,97291,18438,6862,71659,56822,41046,66303,16416,46080,16584,98142,45735,134,3762,886,12639,71475,79221,17789,53603,25615,14257,99661,10849,42764,16075,33141,43002,12411,51306,30186,30167,86166,62762,93481,70485,94108,81029,19511,13726,85556,72991,20825,12914,40695,88549,25961,85240,24438,36982,71659,47811,35515,91677,4628,42909,82535,88858,88068,85984,10119,9034,77837,7851,18852,58961,94166,60310,62670,65507,80865,33424,49901,20505,74615,97130,30601,16457,94422,74554,82029,40231,13396,37774,87239,52499,66372,32365,59547,56283,53840,86036,96572,49803,53498,98632,84872,56853,99776,76807,88130,74425,75294,23156,79676,58602,25846,27290,28407,66132,79313,27440,35663,75396,65306,92883,62342,35005,25007,18928,75425,94270,17713,12460,25846,18031,30904,71150,45139,47411,23400,9238,8272,83815,60362,78006,35865,16754,85973,68644,21860,69853,97656,35225,37290,91250,12931,57011,68109,9812,60709,41968,1523,41853,87798,58039,94331,38053,1258,68705,17779,88807,62171,83991,51602,77416,65113,83808,48692,6560,91912,16273,2400,74647,95754,11184,59660,97919,34985,79773,17378,92600,86109,10388,52737,23127,46006,3645,83895,57782,68473,17601,14838,8516,7304,81498,47651,12263,9364,21556,64652,67077,93166,10194,59772,44271,87419,36985,80698,27692,91493,84919,38431,32678,91720,40199,10976,23941,59508,31698,70678,46366,9656,51454,39136,9870,17218,31573,18264,190,17940,5238,80832,24048,72873,51853,35224,66130,76736,54509,85310,15792,7535,418,36497,62391,57290,54871,22125,99024,31971,50204,5392,18666,62734,87730,84867,64927,20140,65032,16802,35887,51232,8276,18277,775,97564,8169,57312,11162,81355,34441,24798,95467,58970,41904,21532,20492,84768,8344,16615,4203,1003,93196,94149,43936,14499,21767,57074,67577,94341,42172,48075,52942,52487,23757,43540,41478,7884,60367,63906,67086,28897,73133,16655,64457,92173,103,93507,15341,91976,3363,71710,5311,88932,35773,68483,52985,41381,97688,11488,22625,62659,84488,75331,52512,5429,72207,62751,85167,51701,93006,50786,54155,47293,62176,58079,61522,44065,16128,73770,81516,64495,95350,93558,42748,66956,36511,70523,5628,56420,92560,20806,95063,69595,65315,94392,1381,97863,18362,30367,79912,75077,47287,10693,74252,38936,80902,15853,55297,50573,47543,34200,2942,32631,615,38799,87698,7484,26713,78969,74586,21161,56353,72583,76311,45404,91811,87616,66701,44005,66144,38820,31883,38596,89133,19031,47019,71853,41576,16939,86131,66638,58582,91794,57584,5238,53586,64056,92683,61819,5706,68365,92390,31061,3546,2967,65105,27245,33844,50422,56998,3302,86044,22724,65613,92965,37961,26778,94315,3348,83337,36302,15485,46234,60654,9562,28649,60348,1719,56740,7412,77291,22419,13466,38803,98660,25461,964,70548,49989,58066,72540,37552,81934,69147,56485,89653,46260,3820,34352,70645,64972,4427,87846,56065,54643,80091,47148,45212,64556,88849,64393,93492,39565,87297,96100,50620,14959,80952,81629,81308,81518,55361,72204,22051,16120,56961,42112,35755,38768,98460,52181,73824,80267,19785,14786,97795,84295,95521,63995,35938,52141,84679,39642,75942,87936,50691,78381,90756,94022,27483,93507,21119,82838,31416,42416,18752,43636,76717,81785,41664,86312,37810,95438,48510,64840,4853,88860,89440,82023,51780,26791,79282,88819,71595,54011,55973,24342,75123,56881,25587,10478,31673,93793,21133,41232,41581,61558,80520,56890,63070,61423,92367,52343,50617,77633,28378,35054,43150,62414,28712,39631,86993,5195,97584,25968,47868,98845,38552,1131,9443,37383,99016,30217,1863,72339,37009,82290,58320,95175,21480,39886,82656,37014,62947,55244,44047,87356,14942,37342,26363,23581,93988,73425,4687,54409,32098,51285,53281,70612,91739,57878,34595,85788,71031,99111,87813,50107,87421,16109,28646,87435,43828,86546,27902,66611,35271,99489,63057,89536,16366,39360,90740,38588,90545,22003,99271,96227,82469,44447,6847,71439,51447,45325,71573,74079,15715,1612,50593,3532,49828,62994,3367,74271,82397,98471,37142,34906,42609,47077,5533,94919,11445,83120,22559,83132,22266,6726,58735,75025,84617,77240,1266,7033,65860,15132,13916,72380,76226,52619,85469,46129,71485,88769,82806,21306,49889,20174,22253,84074,9488,90425,45569,80557,51936,17707,69725,77591,85827,37164,6220,16288,7563,4503,4266,59118,15674,94554,37017,83710,77368,44546,87114,9087,6783,44811,8216,99394,4470,86051,11964,71202,99387,72490,65941,38309,82884,3438,68731,14466,60096,8607,57691,5459,55513,39721,45561,87385,73009,8512,1947,54868,22865,96700,10974,14867,52251,92537,12602,99031,57743,46843,41556,24867,68610,3658,39309,76312,89295,80038,81868,63518,86621,90193,40804,16940,87391,16525,71845,87363,90987,85996,2857,18011,97711,87641,75758,6438,38950,17168,58367,25982,16024,75526,89865,62996,30730,46772,38830,9836,99079,88619,75104,51406,71990,70813,60200,35579,20867,11840,99506,42451,39253,26919,18080,64276,99866,57292,98048,81013,1998,86763,27351,85280,29527,58321,50029,62359,95135,76775,85820,55900,45679,75050,72496,38452,61241,4405,24818,85643,3721,43759,56341,80476,60468,32641,60637,63988,20237,89922,22771,6071,98318,25816,74738,65569,52876,30964,38572,55620,72607,7041,51175,68573,38694,22015,22993,18767,96864,11952,2301,59289,26533,12809,43306,54849,16751,9346,8264,30036,92879,55395,21987,78113,51554,18919,41710,898,45657,17443,52569,87199,49738,41455,44503,99628,59828,449,15576,8498,35067,70796,4106,17073,5769,99833,83186,68140,40740,1389,70518,40263,78824,3017,22477,17466,48597,6589,64886,89710,47367,1309,24112,25634,9986,50586,52275,20984,8448,17960,92759,69579,27285,43217,80224,66838,14852,82277,80183,8925,74732,30986,5751,6355,42279,4628,38945,89175,81169,45185,8861,30118,89604,85242,73452,24785,70700,77498,72405,35986,28604,90279,89864,73587,58594,15091,2626,78226,22964,89438,65485,65136,43747,4982,45104,93784,93305,56858,38154,21513,77984,72731,78971,13372,58233,66856,18867,85994,53219,20349,56232,46526,91689,9680,63551,567,16962,31736,77413,38805,46624,31863,87316,45540,39220,81075,37914,99882,86548,97786,51569,27164,93974,8341,89910,76799,20476,94419,29608,33011,52898,63391,20100,2868,18304,39608,55400,90684,28633,87898,67383,20593,91339,3011,59454,58540,74549,45750,65057,4722,26798,39461,18770,62680,6471,9692,3926,14074,92722,22852,37188,6018,53298,215,16241,77996,95962,33906,57063,70696,93595,33480,76367,87832,14256,57879,68570,74422,62995,27863,16853,15816,76457,89635,79344,76180,82323,3902,39531,28603,74870,53548,97580,34258,98499,53183,31192,31415,10209,81914,11932,53017,76699,39496,22902,8674,2439,89202,29969,96910,15007,32875,43931,38789,70266,96202,7628,85437,35198,36711,79494,29041,52090,26754,62160,43881,92631,61596,73371,75708,99964,8276,60465,33805,32542,48776,10297,48915,51842,13971,35120,21138,79842,73948,98786,12337,48044,16610,29004,63879,47743,65933,13471,52236,68862,84824,17490,22770,86718,55976,79701,42108,45760,91517,86870,63608,41554,50342,26079,65444,67922,15033,68595,18564,69422,13775,834,41694,56530,15279,75638,21535,37547,5601,1606,30598,52622,86469,64636,82263,93544,78838,30514,50416,89616,27202,29662,45168,77596,35334,5275,26488,27107,41378,86461,6299,18064,48841,86999,30582,86549,29853,71612,53238,69153,20161,60680,43029,96598,21967,6655,79114,23545,74133,11504,29744,94518,52460,48842,10093,97825,17929,8624,16730,65082,83919,55144,11441,43389,56632,57043,92706,12434,44343,86639,8652,70091,77947,71831,16651,93921,46478,36425,33539,89055,57556,34809,47357,85891,45184,65764,37105,97079,40952,80234,71204,31853,71033,97088,66351,25252,22811,98381,30702,99922,90616,16324,89940,60118,55292,86076,64048,9575,83538,94927,28684,29618,65492,1995,24936,50117,44201,18479,10809,40966,52993,1859,12755,73344,47484,97277,34359,50302,89483,10278,34865,31168,54239,14468,85642,6219,34657,66072,28845,30736,50628,6411,47003,99460,27759,59299,93627,14091,28079,17606,8078,73829,55030,98018,39760,68037,56072,67794,67051,2913,23312,25766,2449,67901,45350,61050,68028,74795,85415,33299,31602,99538,82807,14629,53275,79415,24163,10774,61960,23661,39279,4481,58387,3665,99818,23909,51743,6604,66384,84195,40494,19153,44018,18189,96297,95983,43058,41973,57275,75810,32016,43183,42437,9407,33977,49416,79223,90867,7057,80425,38795,14881,25895,83169,30302,72176,42235,24502,37762,1413,64533,29435,13658,39208,76458,19114,37995,77752,36165,14029,44657,88468,71650,77017,44183,22146,89613,60272,26955,81564,44247,61257,10437,47024,37881,35175,36207,40602,70610,95902,1964,2718,19572,10719,71646,19214,80796,44554,5094,81508,49526,54365,85217,58433,2229,8921,54530,73095,88250,25910,80251,23674,36259,61084,69889,9336,90137,37011,27278,25595,57675,121,25666,87666,57612,47271,34884,49112,62190,75910,90171,90123,76909,86885,35422,36794,72105,45163,54477,90340,47350,44137,84155,42126,74764,50100,5982,74746,67051,38909,73632,83973,66460,13128,44028,58310,86465,79525,38868,55830,22695,61640,41596,12539,10304,75558,96566,86477,27059,41851,10518,18764,3020,63615,56952,79767,33769,97233,8551,9675,29741,44707,14033,44306,60024,81244,52440,98647,46948,70338,61127,49387,29386,35992,58945,71140,292,6883,57256,68082,90922,71834,60196,82684,24071,40153,46092,13046,48507,10060,93530,51260,38234,63542,40322,87820,99864,87800,11792,12491,28128,14322,84594,78143,94796,4472,81290,56173,51842,2692,44769,96900,18307,42090,78391,1930,43181,75774,33651,59204,19530,92803,76172,87768,88857,41181,2891,47178,12726,34215,53738,59078,78816,41897,51850,77639,58333,96379,27054,95631,20843,36103,7446,28284,38107,58427,64469,81863,58003,78700,47716,6453,82712,90377,36854,50459,99939,33671,97951,82852,1510,67739,26127,39992,92726,78249,3845,40069,47836,83912,9060,23926,92087,26584,47140,63458,7499,92030,34390,12259,7221,15150,4593,66027,92803,1359,44912,98256,68013,7474,52562,53316,36691,30179,68302,76704,23466,3879,33164,39745,45310,3867,4799,89544,18809,47631,53087,80579,55703,42585,30678,47225,37426,38042,89859,9806,53913,77115,92019,32568,69204,63326,34219,88490,5424,89809,38521,48299,67062,38677,4891,86790,74659,73556,74418,50853,13124,39968,31427,35664,49410,64620,98597,96315,45001,56713,181,670,22636,3882,67982,67512,27960,62563,96805,62624,11216,30199,28039,22705,48069,18845,20198,69437,88093,12438,68876,45813,7745,27268,3265,92278,17760,30995,16011,85210,24436,86781,15164,59963,12857,20497,34736,51221,23813,82480,12042,8848,51845,5384,2548,59260,20636,71352,10509,55861,15374,83882,22473,56414,56540,56915,36999,56197,98857,99269,25260,85962,44350,31308,52135,31404,75078,34724,82746,54310,14301,9931,85760,7110,93299,34781,86613,80997,73462,47689,25337,63973,4,34249,95629,66521,8623,75746,56381,77896,64441,84039,3706,99956,64535,42382,9495,61592,91249,54032,63926,15095,91174,45943,45899,45190,35238,90384,10007,27899,62304,47381,91198,72902,69653,70061,68611,93731,91088,94540,82770,29422,82860,34564,33079,7886,80496,65001,91537,82594,81890,55724,47073,41733,82971,66958,78514,93693,90106,82440,57474,73571,40739,31487,32337,87044,58332,20206,96639,78779,85978,98138,98257,22649,21077,13391,34263,60260,55788,27110,38999,6358,46532,47722,38247,66730,61366,88613,60729,47307,84709,65577,32425,83019,7630,19711,47686,22588,46628,54270,19994,29928,32648,44446,98023,61732,62898,79465,13440,34535,45189,13548,9417,69478,799,240,57582,4742,12810,89805,83751,44677,40452,42620,57485,60962,83965,89898,65865,62672,32665,69672,93680,88697,70636,6713,91969,27151,30124,4443,72194,42867,42598,70393,77799,30546,95121,6331,60913,53167,13673,78974,64807,12299,40768,45958,19488,94274,48061,16207,86930,26614,80643,76494,88463,94939,11389,57141,38798,19896,84846,77574,66965,84271,39167,55093,83531,90593,18229,3124,4468,83606,20359,53101,42695,961,73436,44400,93263,95191,11194,30756,58718,95732,57444,57646,27797,59661,72626,89117,4075,63336,416,39933,69735,27338,38715,58087,54448,15689,7016,81619,51749,55765,97212,3916,4676,25006,78301,93677,19938,81445,76309,4650,37396,70250,34290,86393,35510,77534,11869,39263,98109,77694,57289,99329,51420,764,37782,74935,590,75910,33721,92065,34252,22232,56841,24264,26308,29634,80846,70838,76933,95727,47598,36412,55207,80543,81677,81983,5243,72893,63052,56504,16251,35006,12728,99533,96423,34927,56777,45139,29045,52418,2220,59320,73190,3460,68500,79047,34777,21609,87693,39272,94806,99818,50043,19121,86888,7050,78842,71662,1831,27888,50532,54116,89391,14102,9363,37563,38870,57261,23853,42045,96562,65037,86955,70616,29798,24083,33588,9261,31041,86267,89348,2831,9997,37333,77345,60313,28144,43182,31859,13851,96903,54440,65231,61228,66503,18641,21984,5569,57463,46997,25537,48368,66713,28031,68768,40668,11974,23199,71698,53123,40887,58949,27585,15058,57054,23788,33127,76799,24457,51518,31059,4022,8732,2028,20308,70214,71918,74425,30525,69995,50827,93449,20060,69900,55118,88699,37174,67732,8927,20701,80573,89852,5294,87472,12662,61951,32063,81308,98628,71235,77575,71144,85599,18476,31280,46267,52860,4502,32835,26838,37393,65138,6435,97325,45951,8676,84612,3168,95478,41709,92045,53000,66791,25472,28662,72834,11779,90849,37453,42408,35226,11891,11952,99865,8572,85189,52175,50750,38368,36205,30580,23211,68859,89469,23163,33596,33404,68542,13968,27491,19502,72952,36963,21944,93763,44176,51788,19222,81148,34956,83947,38601,88757,93789,40530,85050,84030,41146,85691,64019,14569,93164,30002,19398,83564,30734,18135,63745,63504,54162,3015,65363,16749,71535,88035,72497,76602,19622,4791,88879,31306,21618,81679,49896,71257,44804,52253,71141,94895,7819,65342,9749,14457,4379,84923,68943,28171,95716,90957,20034,33497,52381,23745,24513,36908,45019,58475,38731,85210,79779,55707,8705,67153,60510,45802,27082,48339,5292,20564,60206,11552,50452,30668,69105,36816,1526,18543,36367,67582,26960,27830,60593,49773,751,70050,5817,18981,95841,73037,67798,87716,95302,9706,66830,80988,70050,34846,44964,84939,27885,38936,72869,94291,45989,25735,18026,88029,2153,1010,21675,30436,59792,43236,62335,53110,59200,79625,53702,86849,91055,72870,11169,74079,56330,78196,29418,8346,19298,7714,95001,70544,38258,63252,53779,43027,11760,59047,21901,76253,39736,53829,70310,159,5394,8357,52048,64389,70169,78032,16260,37356,9471,59550,56907,6176,43683,79052,43464,28221,2186,69076,23710,95418,80412,10392,13571,68986,59954,69526,35573,37637,35800,61745,8341,20817,73436,33284,63906,19634,98241,27141,89359,61830,83810,41112,77163,52011,80679,55830,45177,84983,33729,73912,89851,40532,98417,16315,82915,87114,21279,32506,65071,18997,47081,45020,30946,85523,25043,96347,72946,99802,18659,31274,60781,96872,92129,35518,59705,19473,82239,96902,24537,87947,35309,31109,25877,2111,91577,8928,87027,81481,78147,82064,62517,30971,56422,18854,43404,63056,7458,88135,88226,22854,62778,16607,91365,80944,77346,41973,71539,95078,53310,50935,7064,41846,30139,65549,64823,2256,27819,40689,85545,30109,79817,51299,41508,62532,53534,3168,65241,13383,696,49485,90585,50292,65171,53686,8924,24661,15795,28470,52502,96462,65607,30955,4620,61366,61701,38698,17470,41450,66586,29172,39167,51077,42006,59400,7376,21962,66574,28399,73467,70133,36317,9106,32191,99632,56166,3071,56196,48582,78914,3532,14384,56825,24615,66114,6426,47662,13013,42639,8312,20518,17650,10638,73202,5946,62104,86031,87672,32630,66773,98892,68190,20462,75270,50710,30942,75238,42898,78969,60505,87775,63227,42790,78514,9051,99734,91952,85095,19896,34995,32770,32749,47274,98816,46782,60122,15763,39491,62180,89313,41622,12381,93485,45439,53136,82487,33159,44942,59005,44460,23939,65162,19087,682,45986,51633,4807,11297,28150,44439,3074,48844,92464,94263,13595,50066,87970,88541,21841,71524,6643,99533,74341,34467,45815,65622,672,95922,33604,65602,97633,27028,59055,22388,32114,90899,46357,48644,9189,63056,25052,73595,64767,48290,85098,48347,2868,46922,64112,17446,11989,70040,21871,83270,85523,95850,81016,35089,11133,57473,56926,8606,47838,27891,43767,40942,96012,57033,52038,51811,84023,46959,48383,43953,27578,33963,51623,5482,58525,59773,15536,10553,42486,14318,77607,46299,84435,52065,82782,71185,98932,14023,71342,58194,97091,28451,669,64688,87432,7012,58083,27971,87556,48892,3594,16548,95515,88369,56855,76154,59779,19522,64393,5999,65292,17786,65080,31307,63007,10162,5974,87121,51693,15380,16249,5032,36911,81075,73887,8314,89885,25827,18504,30303,47219,15992,95931,67841,4529,36023,2814,33302,34970,20187,38968,19768,7769,58065,90823,73051,50412,91315,36903,57813,7764,98724,66610,41364,10869,5536,66964,25816,38680,95760,63548,14629,30643,23330,44826,59556,70922,54461,10442,76716,80425,3826,80567,31521,61824,88656,95680,476,92249,443,53468,99336,12425,68285,7632,64259,2800,89576,54432,27570,66125,49759,85826,23253,86239,92267,5954,20050,65515,59043,80100,6920,88266,90966,52991,64780,9745,81044,98289,87824,177,34241,57122,66478,80605,37306,24264,79003,72098,91812,19906,17958,38958,90504,84999,70215,44048,86759,31980,16792,64912,28654,89762,95510,62821,59280,60357,85863,67947,38969,59284,27869,92363,87218,34627,60503,84354,3710,7747,16922,15927,33022,52938,82324,7244,71924,91862,58762,91473,80909,76785,71007,71362,15182,69186,73719,90640,23835,66159,47810,8012,14486,11105,37110,62461,29387,25757,11810,30654,12340,77618,86145,15417,61095,16612,41448,88230,71415,20944,29292,60763,14046,61809,76028,93398,71348,56074,27715,22108,96290,1617,2344,95923,49111,12956,89263,17209,54492,69134,22492,93729,62190,95084,56240,95125,15123,99940,61048,61259,99432,64762,72777,74165,68800,69220,31316,17889,68192,87272,73338,35409,87315,21136,27542,59170,71839,45487,75010,24415,34280,3921,47713,47872,73396,52178,58241,72942,75322,55176,1623,9309,70151,92209,52928,44198,20556,35544,81519,92820,98399,52130,41015,23220,24024,47332,62851,38365,17460,38359,51072,24399,77878,11671,86209,26900,74014,67042,30277,50386,88587,2664,33001,27428,6365,68881,48310,54454,59880,7932,6139,83354,71617,12346,98236,85365,33556,51443,93935,68631,46462,79730,81265,45225,13960,35916,69420,28214,32577,83550,82083,8416,12282,36828,15797,76681,57128,43313,82477,50330,15333,1204,12423,88657,97071,56619,95475,63542,80612,86760,11238,38654,61974,44750,18223,96115,3418,52881,21358,32844,73594,25922,96179,35798,66969,33856,1058,76545,47681,39379,81459,29396,68090,78176,46633,86432,91903,2804,14121,43201,89848,50568,84102,24889,6625,63553,40827,76870,76322,20499,31063,73007,55724,93363,27336,14365,15703,17233,3289,19680,29835,73958,34010,96147,78719,67443,33761,43840,37479,56617,88011,34952,26912,60590,67595,4774,62027,94291,9320,17803,5236,68257,19660,6338,65883,75041,36696,54745,90446,92191,72857,93014,3102,19446,73612,79768,50304,46617,53681,91364,13753,32392,29895,21715,25527,75310,5140,91006,47532,42032,19100,9075,41593,29509,90271,7849,75579,40004,57534,57270,97810,48917,36376,11313,81840,1275,13760,23506,55044,84075,15382,98284,61054,62286,92667,72904,6325,68054,78959,78250,83004,9164,70982,71454,99326,46662,43502,45304,92395,63307,25831,77195,46260,12747,23341,88217,98111,95651,85832,48092,15717,88702,75662,29039,68310,45025,72100,16282,33432,91380,87513,62298,87840,84321,35488,38912,11306,63251,62374,81824,92176,27470,54260,49401,43494,39098,76169,67999,46998,12922,861,37664,12197,70558,38699,80718,24787,92292,72792,76460,89877,78335,40557,70582,84132,98747,75341,37897,99027,65726,38037,29915,82206,54684,11934,89892,71434,39954,93352,78353,43450,97766,32216,36498,16893,98851,19847,90752,59018,169,79703,4568,23128,16902,25299,13137,59756,1257,45938,66319,9161,65100,18756,44806,7381,65540,52658,25126,81178,26783,76468,52878,1901,33792,41373,23896,50675,18277,3907,53516,8925,1422,56274,85588,87362,65573,69761,62404,18011,80201,13787,38993,48744,71728,83895,76660,9650,42026,81391,24519,36572,80774,69132,45761,37284,57733,16502,37110,78977,94110,81442,31298,44832,64662,48294,39017,80628,82894,63231,23317,18400,19679,26369,12450,65587,24296,74005,20885,92936,88158,58448,70297,9396,9726,53841,91509,93504,43943,42617,40579,15691,62764,35631,10522,72294,78671,19531,74188,8621,67950,1626,78165,26221,14289,99683,99472,95616,14731,34298,13205,3698,49171,63059,77719,90269,84390,42055,41771,12427,38952,86479,28649,7306,57297,18540,61271,93121,5906,96733,15205,52230,5411,9342,74480,4265,86408,37782,53964,83779,2351,16430,62208,82308,6375,87059,36920,61937,16870,4081,59263,15878,59593,1489,7536,6413,78387,91494,17220,31307,72663,37214,47190,43963,24329,36922,18659,86807,46698,87825,46978,69007,14461,13722,12575,2856,59929,91132,82251,58748,61160,36900,34743,13320,98590,57836,39317,95865,88231,56171,57429,17542,76424,5754,1837,97498,77112,39501,92865,34390,39264,39302,81993,61440,73593,91515,98051,26948,68265,16043,96050,91858,61433,73867,28642,91686,3816,40657,8969,21301,81089,47009,70909,61622,80260,40018,55715,60077,52230,46809,31894,2142,61457,88888,74628,59259,91359,17365,94301,61206,84193,1884,20521,24175,52168,76815,37027,74998,78491,4755,71730,5847,78813,49286,97172,13738,42901,83019,41818,58810,94403,91887,24593,69326,99956,9292,32153,3762,7231,6473,19358,66327,41297,81309,12308,5669,68624,44817,51339,79775,73660,39460,2706,13317,27007,56168,88069,88690,33881,22903,38595,76583,54250,62148,8397,40386,41393,14751,70322,62738,72409,73010,85627,60169,56824,15268,78425,85445,91189,55496,5515,25661,83249,67246,9486,17178,66287,75712,35864,90235,36052,21085,92694,61147,86357,82445,60637,89860,15314,41842,5377,62347,18099,14607,59123,42653,70879,57282,18066,37533,75014,96093,73664,11824,30393,73591,83025,74538,74440,38876,23325,27817,19792,31540,98567,67928,30470,4214,16904,49121,86588,76230,91490,57881,22069,61953,74434,31699,53958,64114,32161,91648,46392,91320,34000,22477,69883,59348,41678,45554,94019,64773,37140,91204,22347,13671,6877,24166,11200,2153,89839,64952,55671,22847,45356,92792,17493,6166,10580,60156,95860,92513,61567,34258,60293,18649,38079,56250,44252,76139,45973,43574,18831,87804,48335,56510,96091,92386,73215,99890,79084,47902,73132,21166,28260,21665,46537,14060,73527,39129,88400,34166,93859,37377,7043,11430,81550,59262,16953,75867,28961,3681,79833,29289,39320,14361,37175,22790,75672,64009,35313,2997,32220,35376,55123,65795,10422,33915,13424,980,8482,36142,83414,89474,22262,86388,51007,84475,26809,92383,8571,65392,53792,47153,18623,59613,26462,23636,93840,97528,69921,58430,70488,98378,28332,9466,46815,60528,47961,91997,67458,88582,75060,10682,92111,55540,67240,13900,33919,23089,59626,91749,7233,75556,13827,25974,28384,80252,47353,78702,1278,95476,67097,10201,4617,46039,38352,99752,64379,75730,31149,96837,61691,91216,74571,69983,18981,12972,83695,53807,26541,31193,68179,60634,23526,92489,14486,50762,12816,82450,46702,13023,30841,8073,38893,31125,35345,87254,63255,21881,57661,95439,15682,66735,36308,23266,56730,35877,74099,77599,88772,94875,72666,27080,26641,35367,50949,93657,18853,99973,43932,88091,34477,76280,68653,99820,93826,92776,71443,16924,17588,57355,39981,42221,90151,71407,50907,61442,25630,73841,3856,24232,65760,32043,58961,10790,40008,44005,45498,60451,59380,62079,75480,93854,52796,79983,1367,40122,96659,9166,97378,79100,35651,37790,18045,63272,52200,78282,2258,31547,74995,57110,21040,54546,88424,3123,61097,61582,1786,5698,15396,5066,25890,62099,16372,50670,82630,66177,36797,28538,9369,56321,67719,95071,9854,98522,54076,1544,89133,28493,5991,64221,21846,38689,70545,15392,12486,39796,10512,89057,18582,15304,36691,62393,40432,19874,41256,525,1587,73909,51533,34230,9250,36410,72839,44615,22535,22649,53061,87283,4313,37205,61013,66401,22926,28606,75793,50569,43637,59804,39192,3013,23101,12711,15963,93991,56295,5967,92482,32071,17651,32890,43861,50480,75900,95755,91602,60493,89335,11904,40064,68758,96742,45425,73993,21566,38076,87944,85543,83586,12876,71964,44969,91566,36630,37453,15976,87392,93095,93906,86345,47030,38639,43767,96932,13111,37249,63577,96464,75450,75147,51145,31140,56704,30999,49830,16784,66396,38598,32222,45674,18463,33233,624,6192,66376,12319,18758,27111,88629,59548,10506,14667,5978,75369,47301,66944,6625,55954,98714,9853,32211,58269,5462,68303,68188,9851,2337,34296,39474,2358,24585,86140,40898,43931,25691,30357,27453,59895,38759,85516,11326,77108,38557,14688,13436,322,68747,5086,90020,60125,87716,90271,8935,57034,25390,59931,46718,53131,27403,58729,14586,69640,18649,93427,4421,1147,53039,88348,99317,11751,2172,10876,45261,46968,11607,22956,82821,61850,17906,25200,22434,63046,7968,89042,39305,46450,12018,82315,26239,35396,70878,66506,93927,38727,24270,79541,40650,958,99233,99572,30246,15125,34933,91135,40290,15904,49150,10784,20218,91937,17936,55625,93575,26559,7414,29688,90984,50007,40049,21089,89850,93448,83901,74053,91408,50607,73347,16626,877,91914,60485,69848,22093,64493,75023,56715,26082,16018,51085,70757,71438,14241,89655,57041,47383,82879,47793,85520,48760,48742,45305,8031,4744,77381,75833,99060,71330,47384,90784,13564,41631,61440,50529,65143,96073,47759,34907,64937,45622,10158,34347,73732,86936,8341,58259,39235,6995,38223,34896,92735,22524,85294,75191,7303,88492,67785,3089,51438,14307,71174,53556,47645,44364,63177,38094,79230,35979,31288,96004,58086,94026,81879,97110,20149,98422,17767,6691,1257,75305,38216,82569,90649,84575,83813,92820,81361,92051,65104,49451,1202,82832,29217,74171,52686,79770,28091,33814,47717,55010,33159,26445,73263,2747,87891,47086,76007,36085,51924,4760,12680,88060,60447,80108,96783,94905,21797,65920,73209,35710,24726,5923,18013,14799,70213,31895,18526,98434,1733,99303,7899,66539,56716,31667,46363,16740,79127,5674,75669,10921,67521,1595,57447,51780,61408,44686,43923,82758,31092,69107,1706,67525,97587,66545,57527,39653,42357,14928,66189,44804,15046,68109,94420,16427,41357,46851,62094,90595,95229,94382,15016,30183,71085,42243,55713,20287,43415,51150,97194,60126,42301,34406,454,30937,2735,62677,82283,31110,32735,952,69511,46538,95038,74766,67287,93709,37657,75773,75279,36854,17716,87530,71930,44497,49253,55528,50647,27262,49682,67336,51089,71914,3495,51113,99109,87678,11491,25420,65584,86225,51834,44811,23774,55881,5338,53078,97206,14644,19867,57894,85199,50169,23348,61789,62498,47592,44457,66220,62919,55611,88815,73642,83947,94405,849,55304,39689,38041,45520,46665,35662,81289,39291,32891,46994,64478,85622,64624,99771,32867,34211,65705,76735,3894,64920,73088,77816,54688,11366,30070,8707,88062,13934,4920,92230,82152,221,70308,32910,55963,88106,18750,31354,74843,61295,61897,23082,84316,63296,43775,59317,20125,54545,72734,6224,99081,93873,79223,85834,20756,9812,4604,44215,1006,2582,17772,85127,16739,96770,5770,36167,36827,10528,16542,76606,31371,52508,78595,32816,85489,61460,38518,40628,53941,45990,22612,54686,14368,77661,63814,48798,38186,47421,99638,41692,25775,21969,70279,40497,90518,60880,14543,75983,54681,24402,99534,69545,36445,94059,99718,2520,85104,80185,93094,95425,29924,86657,42781,93582,82900,87315,4436,89946,52971,8545,87385,21480,83399,18082,92656,86,63911,31254,33172,68234,48273,76975,83711,86462,5330,73479,11569,9878,78742,54328,19376,95667,68538,39472,70557,23389,33791,21558,63366,74346,6107,90215,33050,6718,94846,57884,31039,87319,93417,59121,83934,16213,85192,64146,18041,37155,44080,2639,47089,83089,37799,18497,33089,80754,16257,90882,48183,36483,74216,92980,31837,34948,87042,19412,75396,48100,46690,77868,56095,17526,5491,14390,72831,95396,99442,29516,29399,78521,61198,4001,66332,67810,19506,75841,15127,48623,89092,75407,5449,72159,45145,98439,16034,27693,93739,36811,65603,14697,24514,32885,95999,12074,47873,27675,51792,70257,38846,11044,6885,31285,98643,25217,60673,48204,98793,70790,91779,8218,39961,34217,78744,4452,39892,11738,10618,348,67263,55040,97243,58437,46038,25110,42208,42218,77582,7924,60838,96818,41061,20046,44434,5717,24414,80430,43085,36574,662,58,63043,45022,95450,55972,87376,36315,18090,93818,16814,52186,26666,69589,80467,43676,31195,46947,5838,33552,42891,59070,33665,73359,78150,25176,9961,712,61703,67917,27566,56204,37224,67809,5623,63343,67876,48089,37636,63320,73968,61006,62631,19314,74506,8333,30763,50129,19356,56452,36079,63348,48316,43493,83840,46681,57063,17037,43652,1100,46306,61105,88771,42911,47610,57784,40000,73505,60134,85518,38003,32025,56573,64045,99300,47391,75081,87065,62316,69883,50107,32865,10473,56987,12944,38984,40722,85389,58444,20483,90250,81925,37705,81805,35252,71906,22406,32386,84883,23221,8089,15261,5792,44211,56561,92500,60962,15568,65020,75833,83412,76864,81956,70565,51169,48916,19338,67146,78331,24370,233,72782,91242,49296,94777,16514,38769,29374,84937,3451,71003,77666,34194,77508,30028,50797,98949,67368,26647,10024,46520,66291,20619,28539,33108,79420,35823,66978,53118,90487,65225,95340,40373,53857,90600,74486,29508,29023,16331,56838,24395,7786,40431,77599,54965,39644,72793,90918,75490,98554,38291,76709,32097,60008,21787,2043,73892,8967,54293,41552,66302,13186,31286,73320,60839,73341,7226,29267,9352,96413,65482,25181,24235,91130,95312,98242,91713,37363,14490,88713,44540,53347,58379,21681,74616,80815,58275,62531,65851,89967,64741,13317,84663,10830,41277,37243,82948,27433,73266,36400,68707,17728,67082,28540,73961,40104,48711,18313,60212,93802,36150,99092,49561,87764,95610,50842,77178,35575,33544,44721,53131,80755,94683,40127,40047,52091,85252,35948,72446,61607,36677,69951,5814,7595,3581,9763,50862,61293,62920,63148,16794,15780,37272,9934,24264,68957,2419,12168,3695,41322,3606,23957,64905,53752,77431,15964,75056,34476,62675,61533,47095,4532,62703,89971,19476,85166,94258,81076,4583,66777,83726,42217,8073,49781,651,40964,65777,59860,56274,78593,1419,82949,53882,98997,5332,8357,65581,87200,71086,80915,38263,53463,94570,99314,49478,83584,47752,61785,72356,77048,27500,36993,5871,68651,14235,97324,27176,91819,56820,36495,27282,29401,81947,25333,89437,56702,66876,97000,83043,65807,44238,64349,91849,88835,69626,14806,26215,65051,8475,89281,61724,35495,68823,64252,49260,3182,84617,24902,59723,17417,15162,82714,85803,79919,38151,88519,62998,23172,23620,85168,16576,32610,7156,71522,15683,72440,39558,85699,56396,45193,80198,40890,85015,87197,14592,73597,4963,97845,32234,61825,16103,94279,8968,67184,11818,75534,32713,85521,28774,31941,40123,58134,28034,84147,6745,74192,48028,37206,6862,51442,73496,15870,42912,33727,80063,41818,99236,13601,81923,84838,94067,49737,91108,80778,29655,71105,65048,48989,87964,70800,2454,53789,33691,52798,45164,98084,92288,69178,90048,77931,45035,96677,56282,18181,58201,98827,70762,64331,95049,15241,62509,82316,28702,68104,16365,686,76469,62773,97922,42785,96861,49994,25831,75172,17858,80822,70353,74780,32947,4880,18013,61082,41231,23813,65460,62794,8381,70794,33805,32972,61702,90456,58466,68364,52620,16320,20584,3346,85322,97548,28313,85107,66245,15281,27488,80716,87446,45048,91962,46558,38146,4149,75120,58297,70830,90409,85031,87584,69155,85158,21360,30490,16248,24734,63295,29800,93720,16274,66701,28607,85012,11621,85708,25967,76369,71513,85860,39940,34336,76210,10866,80281,38467,28217,3919,1156,77984,49059,13783,71056,12409,6102,17926,68898,36783,68812,10480,76126,77669,97019,52842,4502,46726,46473,26300,17396,50376,7017,84355,37150,94716,88176,33552,10179,45370,90328,67687,48391,92139,30400,64000,30761,51887,55540,27314,50595,77734,10651,99950,64773,53157,12252,72613,56028,50638,65340,84081,98188,96231,7489,28055,12291,93531,683,20041,79726,20990,44173,50338,14003,10694,51669,98405,61184,14346,90173,80599,98157,38027,3557,60849,80592,12972,36846,49808,78420,95034,71900,31844,60939,50105,54783,71010,39736,58316,86714,51360,84131,13220,393,14886,47557,88451,99401,35938,8064,32063,84305,85931,13003,64427,82372,2788,3779,92668,63956,63006,18605,42704,50562,47430,87550,12831,79087,83932,88413,66070,71550,13306,76501,12746,9837,95811,57092,72432,81177,30195,86250,8168,96153,35812,55385,81597,368,94799,64343,99889,34942,14470,11440,72393,52205,41874,82177,38016,83697,25150,58504,13154,62975,85163,72907,37630,49300,46034,98875,70319,33838,46002,34738,54357,42589,39030,83979,89084,15098,99990,80783,66011,45663,54659,26837,67888,50159,90713,53985,22282,29479,25484,26532,59775,65389,91764,64458,18183,61315,37737,72985,7250,85036,90101,9672,80186,41293,62571,21641,75007,95406,7490,43108,7424,82470,71362,17163,60892,83090,73473,38315,14951,39377,11369,71470,4782,32868,91781,2754,84265,37367,20644,76819,85247,32261,79897,69296,54501,86382,33501,12392,13811,97612,17871,9984,17411,67535,6944,54830,83927,1702,28187,29455,41880,31621,96869,65899,42908,27652,14948,32947,21335,13180,15255,21743,92344,99300,61727,52237,59017,33056,59480,62008,45307,93641,59523,26540,34284,23404,45907,91933,43843,9869,55618,51884,91285,36907,93124,92864,44973,43184,13156,28570,27628,72341,47266,11503,20678,7870,3249,56575,13008,85645,56648,82852,94669,68764,62043,16289,66579,54855,71618,53093,6030,76326,34912,30732,53429,61509,26564,75741,80495,28048,91575,24378,39906,19893,80056,9873,40094,82224,32682,93116,55830,7339,20682,40762,91111,30493,54217,31333,19688,12666,94708,44500,40661,33707,72713,65457,46844,26312,88040,80903,38942,69840,11212,21273,3438,19046,99586,87526,10,9144,19770,76821,73709,18486,15312,13258,57621,60316,23590,28381,91805,44126,87380,79335,75825,48425,22354,47783,58080,46118,14702,24945,2723,17661,931,48737,90693,84090,69140,32494,39111,9201,55074,31899,79181,96600,36550,30772,40486,33567,31233,62379,87198,1316,82981,55029,2359,46477,84288,46210,275,36043,25345,96521,34109,70790,87557,69686,66428,95155,19222,63489,24967,693,30982,84334,90963,16090,32296,61601,48043,6542,52114,18554,82016,83938,72545,73070,56493,17429,52901,90024,58424,32462,2974,82831,42808,5161,60733,29863,72682,76634,57770,7376,87294,43449,49983,5704,35798,45922,24106,28347,38602,61694,98240,9887,46722,79580,82028,37374,50186,98812,64453,63468,59977,15508,66197,95472,17727,95832,13918,52469,52787,51021,45562,30934,89545,84556,80967,72346,97952,99113,89337,36859,52593,45983,13106,43085,69586,57396,57446,27018,34981,18640,62255,89103,24679,75024,81823,79841,72249,28640,23812,75849,6625,95510,94563,37636,70761,46838,48770,73815,80530,49299,90107,21354,21500,50398,14926,79401,37702,78812,3130,20065,24123,57210,60230,46327,83109,57218,86379,15817,23503,23634,48389,17423,58687,52283,32604,73812,48722,26690,97965,48172,144,11737,76753,9131,20376,79857,62385,99265,18217,11774,19343,38153,37964,16418,94639,50800,48008,7267,83661,86510,23895,99289,40207,84092,12030,61211,14080,30576,19077,21991,91978,77947,81255,40869,8844,80088,92906,9850,4152,31684,75629,62909,39228,71465,95105,57351,94918,88122,21917,70494,89683,31049,6641,24445,46262,54952,77202,3925,72547,18186,90768,83639,62893,76375,94852,31345,54908,81595,84862,93373,89271,41872,43002,31839,71104,49139,86389,96144,76021,36731,23149,77665,84756,2013,12643,47659,16932,55786,59753,40391,41217,84189,21180,38599,40296,60321,92554,65436,89810,8071,3567,86947,64710,94987,56017,94383,18101,12680,16226,98041,15094,14531,92356,15262,30350,96710,11223,39888,31578,90812,67073,84214,93498,98837,96446,34521,49805,14844,77950,50101,61367,24373,46257,47390,52826,5183,92925,40772,35564,70489,8492,4356,57780,74194,37912,29564,15188,4526,82692,35427,46865,12755,48501,72530,7387,8,63145,17370,11309,67551,53660,48694,20936,4630,27744,8253,88512,37524,23481,3754,99067,27462,90392,30099,25038,61581,97482,43565,48112,88573,67429,36310,60303,96987,53914,99990,75863,81817,77181,33266,58243,3979,98215,98815,55787,57730,72790,90140,30509,39910,93453,89879,73686,60640,59052,19854,56428,86112,9844,3222,16867,26899,32098,30869,5585,67160,1664,17779,34305,213,39001,16895,70902,87731,19581,43777,91159,71237,16937,62018,718,16155,37998,81071,73360,91941,37188,29132,49695,3233,96578,67420,38762,50196,96477,77789,63118,22546,89549,5892,74928,26947,50627,16506,11805,8899,6421,5437,94540,16725,54372,64658,60995,89567,88237,97797,70221,2009,31998,67259,4793,67973,79600,36565,3850,33782,34298,13932,16403,50657,96671,57429,4506,60897,4833,18384,68272,51889,82590,18247,11159,99985,47826,11774,32740,6597,14343,53732,59369,85161,72338,97080,40655,12098,66435,92371,41395,29734,51296,22535,41831,44175,84297,72846,30503,7731,89070,10625,77603,73283,92008,80957,92757,73652,44393,5160,51068,8386,21234,48125,82964,72014,85855,63163,85036,76720,67009,9105,31012,46194,27278,26407,55175,42759,91803,81767,77552,80845,62504,68012,9413,72796,56185,61295,16890,12909,58926,26550,22040,14954,40574,34923,6454,92811,78602,98803,21024,96278,66897,53007,14104,57608,58701,9843,85613,50506,30834,67843,14241,39735,95003,93346,9440,75620,10316,68111,89663,551,8596,71976,40856,30101,52452,79869,30744,63118,70447,19978,60560,72398,77503,67278,24394,68595,46734,88213,57755,42,78464,97008,60396,79682,84898,3696,77497,24984,60594,82174,3599,23333,38685,30587,35633,28401,85240,72610,29586,19686,84239,92214,7331,24550,89869,13721,59871,28331,96087,51580,70127,8947,77916,52053,43886,80517,35767,29665,48375,51142,64220,24134,19891,10324,50321,93533,16454,30291,88174,3550,48666,76370,1749,29484,78647,50235,30281,92169,28195,35366,18818,14132,43004,78866,87219,58744,14209,23112,95768,86751,84251,28593,56346,1200,1427,17229,16561,78475,44600,61592,16918,55049,1266,18814,55595,50169,4840,21553,81816,3226,913,5465,50572,61129,92158,26417,30698,13079,24785,39272,37583,17647,99652,50158,81744,41437,74460,69732,92025,58823,64077,18977,50633,18160,69375,13843,66135,2085,3159,41363,88369,48111,14638,34496,90211,52391,22876,25590,19994,95104,47418,17008,64710,85869,74677,88641,83426,87187,28821,22353,82975,64758,96739,81312,86113,70801,25245,26747,36560,6041,27343,61367,78604,55364,53205,57313,87315,7279,30813,15491,99889,35106,62209,4590,7771,108,68945,16800,70782,94301,39739,22538,94263,54541,90915,86294,36949,98851,40878,54553,22756,55763,77672,94799,13935,59406,35958,88474,77983,81787,82423,46827,99322,57344,93063,53030,28159,16228,23989,2575,93612,7087,77669,36730,39429,90895,13167,98280,80877,84578,83033,8226,46543,94027,15613,66333,26773,95296,91114,67072,78999,28024,3392,36779,3419,20032,87404,37369,4662,54933,47542,99594,98748,97474,29305,53634,9484,86198,24686,79391,42757,90199,63481,68576,54420,3332,81557,63524,7098,56068,59020,54988,34635,91505,94157,46320,61217,11719,78870,45342,33953,95501,77672,90576,66316,28590,25583,99056,78669,69004,35,4280,29622,77669,24708,43223,80359,5940,27864,16003,95236,79715,61159,43219,25144,82726,57638,68016,29109,40880,74033,49638,54955,33881,57731,6680,63011,99285,29723,9262,3228,96640,79367,8853,49209,40174,95095,6896,91420,12944,8543,42736,56381,26431,58993,93949,43100,56234,18590,46876,32628,40050,39268,99673,39460,99267,37928,29818,63280,46053,55972,23503,48393,92280,99031,82428,58531,59724,45932,55077,67125,54754,63685,62002,37866,6700,41642,17854,13078,63065,62521,86711,59858,9534,84436,83014,43901,2015,76639,76180,805,79218,72777,28711,64382,82017,2560,78396,12044,17808,57476,1873,12202,96815,84855,51278,29557,86157,59888,62621,21054,22074,34532,10085,94605,57156,53895,50442,88553,9325,39841,86739,66475,6525,4000,97864,37962,29187,87343,27022,62711,72799,22977,25109,55768,97910,29219,65602,31061,87987,66408,25930,31288,55272,4515,84484,22204,26631,68709,97499,43524,26260,1194,34843,64646,75695,65600,47766,62783,39635,39751,74236,38589,27909,38566,48882,56580,68521,32760,96363,82048,27380,59698,12878,26631,29325,53382,7204,60869,38577,26792,40258,55409,51540,48314,60218,76827,93725,25775,6193,12912,22919,74370,47918,53665,7744,6556,81855,35139,93514,18889,78730,47372,94572,1467,85238,54040,39854,56144,18276,10101,90794,48041,28115,11551,90076,24713,15585,15731,77183,41463,12668,91862,23997,29363,8307,50767,61320,45863,45462,77295,53050,67941,93664,8723,97128,86727,75902,64127,41234,24931,72020,44248,43127,30730,84219,21390,20174,1207,77798,97751,25373,21237,17432,26972,45710,62303,91160,7844,31055,16480,98585,51075,92375,45507,17364,67033,18460,63392,97235,61782,44574,85786,27273,84659,30976,10062,42099,96078,8957,87214,31953,1220,10319,41606,24231,39220,12846,94845,28034,1900,91049,27663,15663,17398,91181,37527,73279,62519,31343,43126,87723,82990,59948,22723,33987,3191,8,12891,13128,47448,7257,62640,48696,9835,72191,20031,81307,96091,8103,66172,30387,37205,43868,64975,38154,21631,77656,61587,60315,48777,45116,96226,47704,52594,35162,35290,80433,22441,77322,29918,80601,2814,72371,39727,68035,16378,71627,46279,13311,50060,62583,34367,72856,76097,46078,67337,87644,46572,4576,58496,15756,64506,10473,13029,46145,77611,24916,37942,10352,32185,68346,98668,8073,10170,11688,42453,28291,92786,59359,41857,86415,94713,77041,16794,67239,48828,23910,33015,54682,75563,54634,80024,95718,64198,12440,93830,16055,90648,33174,1589,4457,29736,94808,86884,11089,49362,80495,62643,23354,33294,17235,94810,59332,49271,40039,1159,80355,15571,54256,28983,13669,17980,630,40477,72208,57226,24252,63501,45656,54161,45111,63581,87873,18329,91703,12847,80603,79101,6545,2060,66305,14122,54864,30263,31623,97805,18504,93410,78996,77336,51850,52714,73263,80533,99816,35672,77299,23573,24561,9635,47914,97832,28781,91152,49841,47423,93560,91917,6051,23039,53966,98416,97049,40508,78986,68996,40160,55214,66619,97572,82145,95349,87201,99180,92252,25876,21505,4801,52153,73007,31125,91755,93042,9392,35597,68666,1489,57733,99745,87500,37409,13809,58198,3740,77213,3871,84484,31317,33065,87621,66443,34765,81217,63999,25065,49002,87855,71111,45756,32064,76419,59329,20985,10061,15875,62033,31241,90305,25720,65006,81645,94681,49249,25219,35552,29064,63262,80604,29905,99179,56781,34137,32692,90523,5864,61051,7000,19342,65060,35313,31145,76502,80976,64384,33341,70688,65429,21977,12251,72185,58590,65601,41870,39746,95179,61537,65520,90460,91286,79727,90360,48448,90768,23144,18889,15134,77494,81298,45126,3017,93524,37211,84766,91063,48497,88467,74783,51642,96158,19590,59095,75075,97818,40142,29096,3776,91627,44924,17381,54727,17464,45701,40218,10912,7825,77608,37816,58081,77829,34559,42777,42487,97220,15064,9949,45020,12522,60505,14895,36629,15921,37234,91213,45030,88584,71330,18457,82578,53427,61712,35676,46789,9792,1069,55351,5441,60446,73029,98046,80783,2873,79157,4385,87756,51743,85528,93469,69009,10955,28684,10164,75643,37875,9322,40290,54490,63085,12304,4361,26112,73372,47881,86200,11148,64072,48171,81523,31081,57827,4043,15361,55534,8508,33643,22725,81752,26502,42738,90354,95571,87692,1344,85232,94227,65185,82748,86803,76856,62185,33205,55220,5320,28766,18437,70799,70254,75233,23631,30994,26841,89740,99327,90090,70340,11011,58109,8793,15297,68861,41806,76825,20109,45799,15810,54741,73127,4725,9499,72729,41082,40863,40564,33851,37721,71167,78188,54641,48695,23069,48378,41864,75266,56508,88972,62719,1219,63755,39952,6304,60403,1252,93723,21520,57168,81814,58271,71546,6897,24167,24927,19542,37863,70632,20208,21233,76509,43562,29844,69577,38385,81866,78471,54045,10921,14558,62794,28572,75018,11746,10337,58606,52470,81061,4862,61567,26265,30553,74801,40258,36820,54053,33630,53242,78361,43701,32721,17435,5097,15393,90585,25227,13020,75899,61218,71797,33342,84162,12301,48342,81618,25800,21984,13546,78506,33437,24750,7018,57809,90067,62075,82737,18903,7527,258,70900,68179,63219,2420,78303,89725,91247,38035,29170,61520,84590,20677,3045,53085,64752,35404,59736,5850,5278,98802,68871,79818,64571,12664,73431,21731,21273,23930,58174,51374,1994,14387,91992,14110,1945,3915,76459,51172,19336,89511,69580,75006,29484,11444,27530,65517,72788,37285,76750,94313,4012,83847,19546,23163,49396,11938,84963,21118,88968,26222,15683,21955,32220,95034,45173,17597,44731,10441,49856,12087,85592,64587,9767,27505,59150,9720,62059,1675,22034,95801,22495,86408,55389,73932,23650,51861,73301,41575,92373,96065,91236,76821,66879,20704,60483,88029,3573,88253,49920,81164,87363,96816,37974,6931,74420,17595,73559,84653,31016,36931,59338,7431,13653,61741,66475,34797,12034,93965,94518,49831,65669,62909,54405,22361,15446,51239,70089,98479,43778,14598,71299,37408,87705,71391,10825,28857,99411,13234,63727,88870,33500,91838,55236,81935,30105,24004,2897,14867,68626,38413,58760,17697,24002,77481,53052,49032,19469,55183,97700,23585,96972,77575,49525,89381,74668,60122,75191,30526,96225,91441,62341,20624,24306,10944,84523,22626,68725,48882,27856,40178,79709,2422,99853,30963,96263,66763,83713,54861,27514,88090,32896,34919,75170,20105,46028,96527,77301,85488,81291,33643,22808,65222,14416,54875,77256,988,3286,15827,15215,2544,38512,34299,81825,88444,98397,24221,18359,40566,23138,47838,90776,40459,40387,99822,40129,35618,94027,76257,67611,52755,52237,9775,817,21446,39936,39833,34509,48128,11410,1680,8470,88356,83774,89304,57779,2,10155,4209,79214,3588,26685,78151,89335,8396,87330,55778,47525,49771,42738,36770,92111,48349,24980,65695,88366,76944,26047,41964,64003,86591,99013,91640,92051,2460,62886,35295,35651,90195,12030,76129,880,61158,58282,41124,34235,11454,70765,10228,759,87674,59712,50669,18995,5625,59089,28397,37299,91800,69524,18502,68937,47859,70797,4828,30352,16283,78426,25300,74792,19391,82592,10192,11755,77890,86968,56372,80100,24542,33576,44029,59658,48346,3826,23767,43572,1409,87247,38767,75223,80062,36294,10051,44768,40398,63055,724,23673,33442,65000,56637,94198,73822,27243,60139,16555,93738,11080,94006,54713,24,54831,53399,18354,57903,24853,45635,51537,99908,49706,97491,6954,83144,28782,35155,53079,51110,29157,77198,70472,92350,63067,77990,51386,59951,27815,35283,60397,65980,11022,6734,52834,45155,70809,69350,96644,7541,94124,10750,68848,11246,15737,39398,97774,32532,74815,90402,70822,89033,57767,74353,17200,93884,86873,86085,27991,38503,98742,15748,78092,73986,68849,68601,34642,32961,51071,58926,32297,69674,39125,19345,59630,78529,79688,42747,36149,70848,50906,7302,72479,5428,21018,6223,54753,27631,34399,65733,74104,81551,22382,15216,99378,80171,26855,97490,19528,52283,40893,46500,66131,59988,79150,89248,49361,72663,1216,27382,36366,15409,42804,14249,41055,96953,70940,4048,15570,42326,43462,96090,75751,33499,82475,53846,39754,54912,28801,27346,11562,77916,18728,19398,15547,73846,88048,28816,83398,23045,55775,87804,9823,52351,7956,96237,88600,91692,3850,12359,48261,65473,47683,11046,33407,88554,12370,74847,61413,10517,42805,20395,12032,31209,8557,89392,19556,52299,50945,8597,56958,39206,31565,87026,70305,2248,67352,43860,5349,12658,23037,38233,7261,1429,55806,82158,67446,1807,29309,96245,98224,92349,11469,30533,29554,65247,58607,58180,22545,36590,48120,60565,67248,5157,3740,85850,66403,47435,65826,43993,49048,82312,71941,54251,85767,34056,88690,21183,55299,95102,81418,84069,44431,99492,85927,54654,19678,46644,49751,61710,55073,10028,66588,20340,61261,87207,38485,75144,75650,5314,73806,10261,68836,67560,74401,70181,23369,39680,97873,3221,69053,64080,22578,43929,74125,30338,26704,33362,92953,29174,45220,16364,95339,7690,48417,4218,23137,28288,58166,38960,79378,74850,55407,96333,32220,48145,48499,1995,61222,80443,20218,74212,38375,15460,49878,71658,66048,37065,37145,1104,61841,36050,8484,2946,92454,60784,41826,30052,96831,76072,75646,4483,88137,96686,98116,43274,21211,83720,72897,50383,47329,68363,15065,72110,80325,18876,99567,20912,71044,11813,33342,80588,71653,21752,57410,36708,81861,98496,36889,30701,21819,22682,89585,27749,43487,19140,7765,97330,60335,65514,92244,43898,80240,37368,59734,24447,7624,78403,753,52740,9073,34324,13538,76288,73458,67199,15784,7680,28807,4914,84509,40383,54751,99502,13179,59676,95503,83947,59202,42635,39927,10263,31350,71701,81129,79706,40887,20269,97403,78234,54356,19952,43173,21953,35611,29755,78308,25014,51764,98735,14225,82337,73265,65433,59070,49931,44843,58422,22832,47536,69016,30337,82886,19355,21002,83082,33348,30351,28416,49383,29207,99278,15236,26007,25367,26022,67345,14983,80816,65345,91070,86485,71334,59069,92932,80399,27868,12164,2038,11060,23472,56617,24288,49840,75481,76056,35373,34283,60439,27811,38018,10813,26697,7700,61903,27234,40189,61101,44944,79613,10195,91754,34022,3336,59933,85188,92800,68966,61773,99804,7782,89546,27850,48718,66681,8944,17630,64738,75868,4649,35120,76010,62578,46325,46010,42539,87116,59332,4516,70345,45078,30219,21469,18848,56189,69661,32524,48673,74091,31936,98862,95436,43200,37289,16111,4853,40073,46525,3523,39303,98086,43308,91220,74251,9493,84466,87480,53927,85871,34830,39103,51507,20090,55035,14322,17387,35145,66174,80142,40342,53149,34446,5417,24744,5251,67818,23289,18080,92372,65514,7505,35165,62605,15476,67055,54004,13585,18711,19216,30791,52718,86164,44460,67040,94016,65584,46537,44330,35359,82206,13262,40594,12429,70246,38878,51165,52216,28901,58746,49878,26262,69356,88558,15557,25409,26948,8324,39634,43908,69374,69294,93471,72721,8386,42739,76646,31163,69500,34363,3734,51856,49585,35487,89685,19221,15316,68540,41442,6956,40453,88693,67716,63928,12156,67784,90735,46408,83415,45680,37555,4535,9424,82044,41875,12086,43073,81130,32366,35110,16341,64636,24787,74359,54054,72491,21504,54985,42779,26350,31487,10872,87893,42770,95144,82363,58269,59359,35697,50502,38308,81088,7361,52699,89931,87848,94364,2007,10991,52499,7331,60594,57053,31823,76858,82216,70017,99967,2669,23200,89717,25808,94038,34896,10018,34665,58417,50569,60137,64990,10368,22095,47571,23556,20811,18391,21913,63126,35670,91841,42718,79734,17383,75554,78831,83412,20429,48712,32022,66903,20881,61909,57769,91559,29559,95260,71959,39854,15879,2832,92567,86926,4609,41249,20739,15209,39859,97307,38632,85428,68020,2678,32534,53429,15191,51953,25073,66966,21339,39526,23018,7107,83664,80589,72682,39744,45532,70670,86876,85991,32305,39403,98315,56575,18570,24604,27950,2861,39676,98697,53415,87469,47184,79026,13337,11190,14052,13025,45464,28964,67282,80803,3776,38360,91932,71373,84592,48827,35815,59805,45330,24710,86914,30473,69650,37113,30149,8610,90631,98782,57050,86926,68522,44636,49143,77198,66073,6406,77658,6326,30123,52641,41013,28938,3073,7588,95706,86044,48397,36109,70001,43220,50193,74151,80817,49412,39434,21467,2847,22298,91360,62822,89566,82179,24380,66277,52628,76792,94599,50442,28986,84132,14887,40157,18893,80942,74884,21977,61254,5038,48491,30743,12390,32700,79792,8243,90166,5271,34063,31795,93121,16973,22608,57472,83218,38551,70893,60905,19090,66957,94591,97302,1659,9068,14792,11886,10011,25269,61025,31736,29670,96950,6011,9820,83203,47976,42261,84332,46981,13800,19625,31266,11229,27728,62959,79548,25913,15240,24320,59232,89345,115,4596,59693,62037,95823,87581,62213,83037,54175,86002,17985,30116,11898,85640,74671,89368,4142,38963,68007,1168,99459,58869,79687,88309,61640,36126,83470,29433,30031,21812,9032,54297,41645,16014,34626,72256,55876,81986,89369,21811,38626,62750,17247,22674,25345,40680,87869,66044,63140,16967,13173,34726,44433,41091,10847,64842,91519,53650,96267,66398,30629,743,36190,34065,71754,4192,96132,42945,43613,59236,26553,14189,58088,76006,23348,92994,7074,74352,43371,69556,34283,43275,18703,74614,78266,21810,4258,60256,98383,8879,91584,14106,91761,5729,17451,14506,99675,64723,47530,32884,87075,72565,83847,49866,68181,19773,47649,34488,68377,86736,79204,92365,11533,17920,53764,42791,39301,98292,27505,66831,91391,46390,52555,99292,85655,15698,96035,97402,47178,48121,60293,16973,39672,98542,40842,31272,8227,6041,34932,19353,2110,29708,63933,67058,32651,94726,685,84993,82616,74194,41776,67225,57177,71756,53836,6184,62170,48936,87908,79962,38981,5313,42670,36341,11443,64771,35966,20266,72403,3199,23248,11193,78438,39339,39814,27198,88962,20591,1468,16662,26748,71108,14233,59688,43689,63013,70009,29982,45104,92485,49548,40920,82080,33569,31704,22887,28371,62132,48409,79751,10572,70489,4121,59307,79120,41211,2412,92210,75109,11198,3153,55009,77032,17074,85077,30735,23050,55403,55281,60410,24260,7515,36291,76650,8112,18421,29135,92889,95568,26373,56932,89424,62743,36381,31628,26231,75601,39329,60289,15986,51189,18711,38577,74178,23267,50098,70018,59309,75938,53666,4514,33719,30752,83373,60688,74110,63412,77859,36207,23011,41595,44872,63249,73008,9038,83863,48442,69355,52220,17256,90353,56824,12515,90568,68089,32925,89304,42845,41533,70705,76668,59652,20221,43943,40422,50854,80116,43812,94433,51494,91852,74088,89490,54510,61112,85654,22074,98518,94119,39736,56252,3966,70099,73865,45969,29826,88462,60009,87467,86044,84859,61736,52847,26304,99223,61647,88315,57082,40291,73018,14559,43,89733,97748,95005,53517,49220,69091,32882,86330,20026,38923,45659,32628,71697,82159,47923,67333,30514,56926,94662,52103,94586,64800,45546,41038,82910,27612,55311,48082,51439,17448,43407,71459,73922,25137,54118,22463,3133,9232,27767,22002,83067,56394,23128,37608,40894,48054,88885,65990,97702,95791,86901,17460,19171,63886,19907,9856,29784,55032,63316,93869,40065,34662,31822,38318,83636,27086,19393,77618,73071,85634,18416,17073,55299,36952,77351,18108,76411,97084,57575,5422,46310,76205,76746,25668,45005,5493,94397,51004,61086,9320,8079,62861,75028,53314,53420,22721,81402,74826,82806,66358,36656,56326,1120,53406,27204,42150,81115,4724,50953,53555,3669,13271,52991,82629,40011,75943,74920,18351,47015,63949,43017,80196,48869,52362,54024,46723,99866,57027,32828,51729,61555,67432,35226,13834,56702,45516,85056,49897,8728,91948,42273,33399,50404,79180,79335,91903,9524,50227,66170,79459,61340,45209,28241,72816,2107,42154,19695,95934,80688,34668,74506,62883,74072,60723,2706,42178,6677,93709,39454,57190,65765,29461,85423,86864,63898,82821,93526,5640,44917,80351,45877,19352,2551,48594,5922,50835,37564,34036,12539,58664,52081,24643,75290,62345,48296,58103,76022,84480,6438,56650,42326,53502,62452,49881,29666,6566,28738,11000,52367,2496,42684,13550,53347,2254,85597,63782,49820,62769,98374,70760,14181,70785,55471,31945,63796,79348,15241,84605,51133,47605,44147,57609,9215,55408,97846,92962,37585,81875,71162,54659,29416,78077,77217,70922,60555,68178,74773,19074,23086,30153,44466,36281,60784,66479,15780,37441,84671,17637,50635,43936,37359,25431,22254,67229,54283,91344,24870,58108,5148,66521,79541,68501,2556,12285,8236,33395,26910,56228,10984,19364,27802,20368,64758,2994,39045,56679,91600,93815,420,36996,8395,43614,15968,29616,40883,84404,66177,7001,53356,73562,30489,38982,69488,97785,75788,20523,91064,76416,97914,13215,17137,5895,26114,59548,87539,97483,2377,23913,64947,2759,48082,78824,69894,24757,8638,36958,54534,78480,78828,27683,84868,44802,56081,42871,17298,96495,89640,26555,1363,89041,31098,62953,33865,89565,24456,86325,78756,59817,55852,4074,41300,79967,86097,84543,53352,8570,91482,20977,19411,78423,4108,91369,85334,17806,79196,31335,61502,39796,10691,41468,33595,90079,96697,66311,47162,79643,69602,52462,92316,78364,92900,48221,48583,77385,92312,73278,62989,71252,73792,83086,29041,19039,90589,9892,3956,37693,56235,84048,35998,24409,65373,23171,43148,71721,36720,91708,83572,95512,81721,99692,8739,25464,40568,53174,40728,72769,55385,95857,91668,76481,75186,86564] -------------------------------------------------------------------------------- /src/array/combinationSum.js: -------------------------------------------------------------------------------- 1 | var combinationSum = function (candidates, target) { 2 | candidates.sort( (a,b) => a - b) 3 | const rPath = []; 4 | const len = candidates.length; 5 | let totalNum = 0; 6 | const iteration = (start, path) => { 7 | for (let i = start; i < len; i++) { 8 | const currentVal = candidates[i]; 9 | totalNum += currentVal; 10 | path.push(currentVal); 11 | 12 | if (totalNum < target) { 13 | iteration(i, path); 14 | } else { 15 | if (totalNum === target) { 16 | rPath.push([...path]) 17 | } 18 | totalNum -= path.pop(); 19 | break; 20 | } 21 | } 22 | totalNum -= path.pop(); 23 | } 24 | iteration(0, []) 25 | return rPath; 26 | } 27 | combinationSum([2, 3, 6, 7], 7); -------------------------------------------------------------------------------- /src/array/findKthLargest.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 数组中的第K个最大元素 3 | * 在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 4 | * 5 | * 示例 1: 6 | * 7 | * 输入: [3,2,1,5,6,4] 和 k = 2 8 | * 输出: 5 9 | * 示例 2: 10 | * 11 | * 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 12 | * 输出: 4 13 | * 说明: 14 | * 15 | * 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。 16 | * @param {number[]} nums 17 | * @param {number} k 18 | * @return {number} 19 | */ 20 | var findKthLargest = function(nums, k) { 21 | //O(n*n) 22 | let rList = []; 23 | while(rList.length < k){ 24 | let maxIndex = 0; 25 | for(let i=0,len=nums.length; i nums[maxIndex])maxIndex = i; 27 | } 28 | rList.push(nums[maxIndex]); 29 | nums[maxIndex] = -1; 30 | } 31 | console.log(rList) 32 | return rList[rList.length - 1] 33 | 34 | }; 35 | var findKthLargest1 = function(nums,k){ 36 | //使用快排算法处理 O(nlogn) 37 | quickSork(nums) 38 | return nums[k - 1]; 39 | 40 | } 41 | var quickSork = function(list){ 42 | //递归公式: quickSork(s……e) = quickSork(s……q-1) + quickSork(q+1 …… e) 43 | //终止条件: s >= e 44 | const quickSork_c = (list,s,e)=>{ 45 | if(s >= e)return; 46 | //获取分区点 47 | let q = partition(list,s,e); 48 | quickSork_c(list,s,q - 1); 49 | quickSork_c(list,q+1,e) 50 | } 51 | quickSork_c(list,0,list.length-1); 52 | } 53 | 54 | const partition = (list,s,e)=>{ 55 | //取最后一个值,作为中心点 56 | let pivot = list[e] 57 | //给当前的数组排序,大于中心点的放在左边,小于中心点的放到右边(大到小排列) 58 | let j = s; 59 | for(let i=s; i<=e; i++){ 60 | if(list[i] <= pivot) 61 | { 62 | let temp = list[i]; 63 | list[i] = list[j]; 64 | list[j] = temp; 65 | j++; 66 | } 67 | } 68 | 69 | return j - 1; 70 | 71 | } -------------------------------------------------------------------------------- /src/array/isPalindrome.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 验证回文串 3 | * 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 4 | * 5 | * 说明:本题中,我们将空字符串定义为有效的回文串。 6 | * 7 | * 示例 1: 8 | * 9 | * 输入: "A man, a plan, a canal: Panama" 10 | * 输出: true 11 | * 12 | * 示例 2: 13 | * 14 | * 输入: "race a car" 15 | * 输出: false 16 | * 17 | * 18 | * @param {string} s 19 | * @return {boolean} 20 | */ 21 | var isPalindrome = function (s) { 22 | //去除空格 23 | //全部转换为 小写 24 | //只判断 数字和字母 25 | s = s.trim().toLocaleLowerCase(); 26 | let i = 0; 27 | let j = s.length - 1; 28 | 29 | const pattern = /\w/; 30 | //对撞指针 -> 利用2个指针,头指针和尾指针,然后向中间靠拢 31 | while (i < j) { 32 | if (!pattern.test(s[i])) { 33 | i++; 34 | } 35 | else if (!pattern.test(s[j])) { 36 | j--; 37 | } else { 38 | if (s[i] === s[j]) { 39 | i++; 40 | j--; 41 | } else { 42 | return false; 43 | } 44 | } 45 | 46 | } 47 | return true; 48 | 49 | }; 50 | 51 | console.log(isPalindrome("race a car")); -------------------------------------------------------------------------------- /src/array/maxArea.js: -------------------------------------------------------------------------------- 1 | /** 2 | * maxArea 3 | * leetcode 11题 4 | * 盛最多水的容器 5 | * 给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 6 | * 7 | * 说明:你不能倾斜容器,且 n 的值至少为 2。 8 | * 9 | * 图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。 10 | * 11 | * 12 | * 13 | * 示例: 14 | * 15 | * 输入: [1,8,6,2,5,4,8,3,7] 16 | * 输出: 49 17 | * 18 | * @param {number[]} height 19 | * @return {number} 20 | */ 21 | var maxArea = function(height) { 22 | //着道题就是求范围,x轴为 长 , y轴为 高 23 | //1. 使用2个指针, 不断的缩小(哪边的y轴的值小,就缩哪边)。 24 | //记录一个最大值 25 | let i = 0; 26 | let j = height.length - 1; 27 | let width = height.length - 1; 28 | let mA = 0; 29 | while( i < j){ 30 | //求出最小值, 因为容器的高是以最小的值来定义的 31 | //哪边的高度小就缩哪边 -> 力求遇到高度很大的值 32 | let h; 33 | if(height[i] < height[j]){ 34 | h = height[i]; 35 | i++; 36 | }else{ 37 | h = height[j]; 38 | j--; 39 | } 40 | 41 | //计算完当前的范围 42 | const area = h * width; 43 | //只记录最大值 44 | if(area > mA) mA = area; 45 | 46 | //每次缩完后,宽也要随之变化 47 | width--; 48 | 49 | } 50 | return mA; 51 | }; 52 | console.log(maxArea([1,2,4,3])) -------------------------------------------------------------------------------- /src/array/merge.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 合并两个有序数组 3 | * 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。 4 | * 5 | * 说明: 6 | * 7 | * 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。 8 | * 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。 9 | * 示例: 10 | * 11 | * 输入: 12 | * nums1 = [1,2,3,0,0,0], m = 3 13 | * nums2 = [2,5,6], n = 3 14 | * 15 | * 输出: [1,2,2,3,5,6] 16 | * @param {number[]} nums1 17 | * @param {number} m 18 | * @param {number[]} nums2 19 | * @param {number} n 20 | * @return {void} Do not return anything, modify nums1 in-place instead. * 21 | * 这个操作相当于归并算法的 partition 的过程 22 | * */ 23 | var merge = function (nums1, m, nums2, n) { 24 | //时间复杂度 O(m + n); 25 | //空间复杂度 O(m + n); 26 | let newNums1 = []; 27 | for (let i = 0; i < m; i++) { 28 | newNums1[i] = nums1[i] 29 | } 30 | let newNums2 = []; 31 | for (let i = 0; i < n; i++) { 32 | newNums2[i] = nums2[i] 33 | } 34 | 35 | 36 | let i = 0; 37 | let j = 0; 38 | let k = 0; 39 | while (newNums1[i] !== undefined && newNums2[j] !== undefined) { 40 | if (newNums1[i] < newNums2[j]) { 41 | nums1[k] = newNums1[i] 42 | i++; 43 | } 44 | if (newNums1[i] >= newNums2[j]) { 45 | nums1[k] = newNums2[j]; 46 | j++; 47 | } 48 | k++; 49 | } 50 | 51 | if (i < newNums1.length) { 52 | for (; i < newNums1.length; i++) { 53 | nums1[k] = newNums1[i] 54 | k++; 55 | } 56 | } 57 | 58 | if (j < newNums2.length) { 59 | for (; j < newNums2.length; j++) { 60 | nums1[k] = newNums2[j] 61 | k++; 62 | } 63 | } 64 | }; 65 | // merge([1,2,3,0,0,0],3,[2,5,6],3) 66 | // merge([4,5,6,0,0,0],3,[1,2,3],3) 67 | /** 68 | * 69 | * todo 官方推荐 尾插入法 70 | * 利用 nums1 额外的内存空间, 把 nums1 和 nums2 比对大小 把大的插入到 nums1 的尾部 71 | * @param {*} nums1 72 | * @param {*} m 73 | * @param {*} nums2 74 | * @param {*} n 75 | */ 76 | var merge1 = function (nums1, m, nums2, n) { 77 | //时间复杂度 O(m+n) 78 | //空间复杂度,这里利用了 nums1 的空间,没有额外增加新的内存空间 79 | let i = m - 1; 80 | let j = n - 1; 81 | let k = nums1.length - 1; 82 | while (nums1[i] !== undefined && nums2[j] !== undefined) { 83 | if (nums1[i] > nums2[j]) { 84 | nums1[k] = nums1[i]; 85 | i--; 86 | } else { 87 | nums1[k] = nums2[j] 88 | j--; 89 | } 90 | k--; 91 | } 92 | 93 | for (; i >= 0; i--) { 94 | nums1[k] = nums1[i] 95 | k--; 96 | } 97 | 98 | for (; j >= 0; j--) { 99 | nums1[k] = nums2[j] 100 | k--; 101 | } 102 | return nums1; 103 | } 104 | 105 | merge1([1,2,3,0,0,0],3,[2,5,6],3) 106 | // merge1([0], 0, [1], 1); -------------------------------------------------------------------------------- /src/array/minSubArrayLen.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 长度最小的子数组 3 | * 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。 4 | * 5 | * 示例: 6 | * 7 | * 输入: s = 7, nums = [2,3,1,2,4,3] 8 | * 输出: 2 9 | * 解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。 10 | * 11 | * 进阶: 12 | * 13 | * 如果你已经完成了O(n) 时间复杂度的解法, 请尝试 O(n log n) 时间复杂度的解法。 14 | * @param {number} s 15 | * @param {number[]} nums 16 | * @return {number} 17 | */ 18 | var minSubArrayLen = function (s, nums) { 19 | //当前这个算法比较暴力,需要优化 20 | //优化点:利用之前记录的结果,不要在重新计算(todo) 21 | if (nums.length === 0) return 0; 22 | let minValue = 0; 23 | 24 | //i 是滑动窗口的左侧 25 | let i = 0; 26 | //i 是滑动串钩的右侧 27 | let j = 0; 28 | let tempSum = 0; 29 | while (i < nums.length) { 30 | if (tempSum < s && j < nums.length) { 31 | tempSum += nums[j]; 32 | j++; 33 | } else { 34 | if (tempSum >= s) { 35 | let k = j - i; 36 | if (k < minValue || !minValue) minValue = k; 37 | } 38 | i++; 39 | j = i; 40 | tempSum = 0; 41 | } 42 | } 43 | return minValue; 44 | }; 45 | // console.log(minSubArrayLen(7,[2,3,1,2,4,3])) 46 | // console.log(minSubArrayLen(11, [1, 2, 3, 4, 5])) 47 | /** 48 | * 利用之前算过的值,不在重新计算 49 | * @param {*} s 50 | * @param {*} nums 51 | */ 52 | var minSubArrayLen1 = function(s,nums){ 53 | if(nums.length === 0)return 0; 54 | let value = 0; 55 | 56 | let l = 0; 57 | let r = 0; 58 | let sum = 0; 59 | while(l < nums.length){ 60 | if(sum < s && r < nums.length){ 61 | sum += nums[r] 62 | r++; 63 | }else{ 64 | if(sum >= s){ 65 | sum -= nums[l] 66 | let k = r - l; 67 | if(value > k || !value) value = k; 68 | } 69 | l++; 70 | } 71 | } 72 | return value; 73 | } 74 | console.log(minSubArrayLen1(7,[2,3,1,2,4,3])) -------------------------------------------------------------------------------- /src/array/moveZeroes.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @param {number[]} nums 3 | * 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 4 | * 5 | * 示例: 6 | * 7 | * 输入: [0,1,0,3,12] 8 | * 输出: [1,3,12,0,0] 9 | * 10 | * 说明: 11 | * 12 | * 必须在原数组上操作,不能拷贝额外的数组。 13 | * 尽量减少操作次数。 14 | * 15 | * 16 | * @return {void} Do not return anything, modify nums in-place instead. 17 | */ 18 | var moveZeroes = function (nums) { 19 | //1.最简单的办法,遇到 0 的话就一直往后移动(从后往前遍历,遇到零结束移动) 20 | //时间复杂度 O(n^2) 21 | if(!nums)return; 22 | if(nums.length === 0 || nums.length === 1)return; 23 | if(!Array.isArray(nums))return; 24 | 25 | // var len = nums.length; 26 | // for(var i=len - 1; i>=0; i--){ 27 | // if(!nums[i]){ 28 | // var j = i; 29 | // while(j < len && nums[j+1]) 30 | // { 31 | // nums[j] = nums[j + 1]; 32 | // j++; 33 | // } 34 | // nums[j] = 0; 35 | // } 36 | // } 37 | //2. 把数组分成2个部分,j 记录位置,j 为0的数,利用2个值的交换 38 | //O(n) 39 | var j = 0; 40 | for(var i=0, len= nums.length;i= 0; j--) { 34 | //如果当前值小于排好序的值 那么交换位置 35 | //交换位置的技巧 -》 右移:上一个的值 = 当前的值 36 | if (cur < nums[j]) { 37 | nums[j+1] = nums[j] 38 | }else{ 39 | break; 40 | } 41 | } 42 | //最后赋值即可 43 | nums[j+1] = cur; 44 | } 45 | return nums; 46 | }; 47 | 48 | /** 49 | * 另外一种思路 50 | * 因为题目表明只有 3 种颜色 即 [0,1,2] 51 | * 遍历数组的时候 只需要把 0 放置表头, 2 放置表尾, 1 无须处理 52 | * @param {*} nums 53 | */ 54 | var sortColors1 = function(nums){ 55 | //2个指针 对应这开始位置,和结束位置 56 | let low = 0; 57 | let high = nums.length - 1; 58 | let curIndex = 0; 59 | 60 | while(curIndex <= high){ 61 | if(nums[curIndex] === 0){ 62 | let temp = nums[curIndex]; 63 | nums[curIndex] = nums[low] 64 | nums[low] = temp; 65 | low++; 66 | curIndex++; 67 | }else if(nums[curIndex] === 2){ 68 | let temp = nums[curIndex]; 69 | nums[curIndex] = nums[high] 70 | nums[high] = temp; 71 | high--; 72 | //解释为什么这里不需要 curIndex++ 73 | //因为 high-- 了,总长度减了1,那么 curIndex 就不需要++了 不然就多移动了一位 74 | }else{ 75 | curIndex++; 76 | } 77 | } 78 | return nums; 79 | } 80 | sortColors1([1, 2, 0]); -------------------------------------------------------------------------------- /src/array/twoSum.JS: -------------------------------------------------------------------------------- 1 | /** 2 | * 两数之和 II - 输入有序数组 3 | * 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。 4 | * 5 | * 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。 6 | * 7 | * 说明: 8 | * 9 | * 返回的下标值(index1 和 index2)不是从零开始的。 10 | * 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。 11 | * 12 | * 示例: 13 | * 14 | * 输入: numbers = [2, 7, 11, 15], target = 9 15 | * 输出: [1,2] 16 | * 解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。 17 | * 18 | * @param {number[]} numbers 19 | * @param {number} target 20 | * @return {number[]} 21 | **/ 22 | var twoSum = function(numbers, target) { 23 | //利用 hash O(1) 查询 24 | let hash = {}; 25 | for(let i=0,len=numbers.length; i < len; i++){ 26 | let s =target - numbers[i] 27 | if(hash[s] !== undefined) 28 | { 29 | return [hash[s]+1,i+1] 30 | } 31 | //后添加,保证 index1 小于 index2 32 | hash[numbers[i]] = i; 33 | } 34 | }; 35 | var twoSum1 = function(numbers,target){ 36 | //使用对撞指针法 37 | let i = 0; 38 | let j = numbers.length - 1; 39 | while(i < j){ 40 | if(numbers[i] + numbers[j] < target){ 41 | i++; 42 | }else if(numbers[i] + numbers[j] > target){ 43 | j--; 44 | }else{ 45 | return [i+1,j+1] 46 | } 47 | } 48 | } 49 | // console.log(twoSum([2, 7, 11, 15],9)); 50 | console.log(twoSum1([2, 7, 11, 15],9)); -------------------------------------------------------------------------------- /src/dataStructure/DoublyLink.js: -------------------------------------------------------------------------------- 1 | module.exports = class DoublyLink { 2 | constructor() { 3 | this.head = null; 4 | this.length = 0; 5 | } 6 | /** 7 | * 获取链表中第 index 个节点的值。如果索引无效,则返回-1。 8 | * @param {*} index 9 | */ 10 | get(index) { 11 | if(index >= this.length){ 12 | return -1; 13 | } 14 | let node = this.head; 15 | for (var i = 1; i <= index; i++) { 16 | node = node.next; 17 | } 18 | return node.value; 19 | } 20 | 21 | /** 22 | * 在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。 23 | * @param {*} val 24 | */ 25 | addAtHead(val) { 26 | let newNode = new DoublyLinkNode(val); 27 | if (this.head) { 28 | newNode.next = this.head.next; 29 | newNode.next.prev = newNode 30 | } 31 | this.head = newNode; 32 | this.length++; 33 | } 34 | 35 | /** 36 | * 将值为 val 的节点追加到链表的最后一个元素。 37 | * @param {*} val 38 | */ 39 | addAtTail(val) { 40 | //1. 先找到最后一个元素 41 | if (!this.head) { 42 | this.head = new DoublyLinkNode(val); 43 | } else { 44 | var tailNode = this.head; 45 | while (tailNode.next) { 46 | tailNode = tailNode.next; 47 | } 48 | 49 | tailNode.next = new DoublyLinkNode(val); 50 | tailNode.next.prev = tailNode; 51 | 52 | } 53 | this.length++; 54 | 55 | } 56 | 57 | /** 58 | * 在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。 59 | * @param {*} index 60 | * @param {*} val 61 | */ 62 | addAtIndex(index, val) { 63 | if (index > this.length) { 64 | return; 65 | } 66 | if (index === this.length) { 67 | this.addAtTail(val); 68 | } else if (index === 0) { 69 | this.addAtHead(val); 70 | } else { 71 | //1. 先找到index所在的node 72 | let node = this.head; 73 | for (var i = 1; i <= index; i++) { 74 | node = node.next; 75 | 76 | } 77 | let newNode = new DoublyLinkNode(val); 78 | 79 | node.prev.next = newNode; 80 | newNode.prev = node.prev; 81 | 82 | newNode.next = node; 83 | node.prev = newNode; 84 | this.length++; 85 | } 86 | } 87 | 88 | /** 89 | * 如果索引 index 有效,则删除链表中的第 index 个节点。 90 | * @param {*} index 91 | */ 92 | deleteAtIndex(index) { 93 | if (index < this.length) { 94 | //1. 先找到index所在的node 95 | let node = this.head; 96 | if (index === 0) { 97 | if (this.head.next) { 98 | this.head = this.head.next 99 | } else { 100 | this.head = null; 101 | } 102 | } else { 103 | for (var i = 1; i <= index; i++) { 104 | node = node.next; 105 | } 106 | 107 | if (node.prev) { 108 | node.prev = node.next; 109 | } 110 | 111 | if (node.next) { 112 | node.next.prev = node.prev; 113 | } 114 | } 115 | 116 | } 117 | } 118 | } 119 | 120 | class DoublyLinkNode { 121 | constructor(value) { 122 | this.prev = null; 123 | this.next = null; 124 | this.value = value; 125 | } 126 | } -------------------------------------------------------------------------------- /src/dataStructure/Graph.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 简单的图数据结构 3 | */ 4 | class Graph{ 5 | constructor(){ 6 | this._v = 0; 7 | this._linkedList = {} 8 | } 9 | 10 | add(s,t){ 11 | if(!this._linkedList[s]) 12 | { 13 | this._linkedList[s] = []; 14 | this._v++; 15 | } 16 | this._linkedList[s].push(t); 17 | } 18 | getLinkedList(){ 19 | return this._linkedList; 20 | } 21 | 22 | } 23 | module.exports = Graph; -------------------------------------------------------------------------------- /src/dataStructure/Heap.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Heap 堆 3 | * 应用:优先级队列、top K、堆排序、求中位数 4 | * 入堆 、 出堆 、建堆、 5 | * 小顶堆 6 | */ 7 | 8 | class Heap{ 9 | constructor() { 10 | //需要从1开始 11 | this._list = [null]; 12 | this._count = 1; 13 | } 14 | 15 | insert(data){ 16 | this._list[this._count] = data; 17 | this._count++; 18 | //从下到上 堆化 19 | let i = this._count -1; 20 | //如果父节点存在并且父节点的值大于当前节点的值,那么交换位置 21 | this.bottomToTopHeapify(this._list,i); 22 | } 23 | 24 | remove(){ 25 | //1. 删除堆顶的元素 26 | //2. 把最后一个元素放到堆顶的位置 27 | //3. 从上往下堆化 28 | let i = 1; 29 | let heapTopValue = this._list[i]; 30 | this._list[i] = this._list[--this._count]; 31 | 32 | while (this._list[i * 2]) { 33 | if (this._list[i * 2] < this._list[i]) { 34 | //交换位置 35 | //左侧 36 | this.swap(this._list,i,i*2); 37 | i = i * 2 38 | }else if(this._list[i * 2 + 1] < this._list[i]){ 39 | //右侧 40 | this.swap(this._list,i,i*2 + 1); 41 | i = i * 2 + 1 42 | }else{ 43 | break; 44 | } 45 | } 46 | return heapTopValue; 47 | } 48 | //建堆 49 | buildHeap(list){ 50 | //从非叶子节点开始 51 | 52 | let len = list.length; 53 | let i = len - 1; 54 | for(i/2; i>=1; i--){ 55 | console.log(Number.parseInt(i/2)) 56 | this.bottomToTopHeapify(list,i) 57 | //从下往上堆化 58 | } 59 | this._list = list; 60 | this._count = len; 61 | } 62 | 63 | //下往上堆化 64 | bottomToTopHeapify(list,i){ 65 | while(list[Number.parseInt(i / 2)] && list[Number.parseInt(i / 2)] > list[i]){ 66 | //交换位置 67 | const parentIndex = Number.parseInt(i / 2); 68 | this.swap(list,parentIndex,i) 69 | i = parentIndex; 70 | } 71 | } 72 | 73 | swap(list,a,b){ 74 | let temp = list[a]; 75 | list[a] = list[b]; 76 | list[b] = temp; 77 | } 78 | } 79 | var heap = new Heap(); 80 | 81 | heap.buildHeap([5,3,7,9,4,2,23,6]) 82 | 83 | 84 | // heap.insert(10); 85 | // heap.insert(2); 86 | // heap.insert(1); 87 | // heap.insert(4); 88 | // heap.insert(8); 89 | // heap.insert(3); 90 | 91 | 92 | 93 | // console.log(heap.remove()); 94 | // console.log(heap.remove()); 95 | // console.log(heap.remove()); 96 | // console.log(heap.remove()); 97 | // console.log(heap._list) -------------------------------------------------------------------------------- /src/dataStructure/MinStack.js: -------------------------------------------------------------------------------- 1 | /** 2 | * initialize your data structure here. 3 | * 使用2个数组来解决 4 | * 1个数组存放所有的数据,另外一个数组放置最小的数据 5 | */ 6 | var MinStack = function() { 7 | this.min = null; 8 | this.list= []; 9 | this.s2 = []; 10 | }; 11 | 12 | /** 13 | * @param {number} x 14 | * @return {void} 15 | */ 16 | MinStack.prototype.push = function(x) { 17 | if (this.s2.length === 0 || this.s2[this.s2.length - 1] >= x ) { 18 | this.s2.push(x); 19 | } 20 | this.list.push(x) 21 | 22 | }; 23 | 24 | /** 25 | * @return {void} 26 | */ 27 | MinStack.prototype.pop = function() { 28 | let val = this.list.pop(); 29 | if(val === this.s2[this.s2.length - 1]){ 30 | this.s2.pop(); 31 | } 32 | }; 33 | 34 | /** 35 | * @return {number} 36 | */ 37 | MinStack.prototype.top = function() { 38 | return this.list[this.list.length - 1] 39 | }; 40 | 41 | /** 42 | * @return {number} 43 | */ 44 | MinStack.prototype.getMin = function() { 45 | return this.s2[this.s2.length - 1]; 46 | }; 47 | 48 | 49 | /** 50 | * Your MinStack object will be instantiated and called as such: 51 | * var obj = Object.create(MinStack).createNew() 52 | * obj.push(x) 53 | * obj.pop() 54 | * var param_3 = obj.top() 55 | * var param_4 = obj.getMin() 56 | */ 57 | let minstack = new MinStack(); 58 | minstack.push(-2); 59 | minstack.push(0); 60 | minstack.push(-3); 61 | console.log(minstack.getMin()) 62 | minstack.pop(); 63 | console.log(minstack.getMin()) 64 | -------------------------------------------------------------------------------- /src/dataStructure/MyCircularQueue.js: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Initialize your data structure here. Set the size of the queue to be k. 4 | * @param {number} k 5 | */ 6 | var MyCircularQueue = function(k) { 7 | this._list = new Array(k) 8 | this._head = -1; 9 | this._tail = -1; 10 | }; 11 | 12 | /** 13 | * Insert an element into the circular queue. Return true if the operation is successful. 14 | * @param {number} value 15 | * @return {boolean} 16 | */ 17 | MyCircularQueue.prototype.enQueue = function(value) { 18 | //入队是添加到尾部, tail ++; 19 | //如果队列已经满了,那么将不能再添加新的元素 20 | if(this.isFull()){ 21 | return false; 22 | } 23 | if(this.isEmpty()){ 24 | this._head = 0; 25 | } 26 | 27 | this._tail = (this._tail + 1) % this._list.length; 28 | this._list[this._tail] = value; 29 | return true; 30 | 31 | }; 32 | 33 | /* 34 | * Delete an element from the circular queue. Return true if the operation is successful. 35 | * @return {boolean} 36 | */ 37 | MyCircularQueue.prototype.deQueue = function() { 38 | if(this.isEmpty()){ 39 | return false; 40 | } 41 | this._list[this._head] = null; 42 | if(this._head === this._tail){ 43 | this._head = this._tail = -1; 44 | }else{ 45 | this._head = (this._head + 1) % this._list.length; 46 | } 47 | return true; 48 | }; 49 | 50 | /** 51 | * Get the front item from the queue. 52 | * @return {number} 53 | */ 54 | MyCircularQueue.prototype.Front = function() { 55 | if(this.isEmpty()){ 56 | return -1; 57 | } 58 | return this._list[this._head]; 59 | }; 60 | 61 | /** 62 | * Get the last item from the queue. 63 | * @return {number} 64 | */ 65 | MyCircularQueue.prototype.Rear = function() { 66 | if(this.isEmpty()){ 67 | return -1; 68 | } 69 | return this._list[this._tail] 70 | }; 71 | 72 | /** 73 | * Checks whether the circular queue is empty or not. 74 | * @return {boolean} 75 | */ 76 | MyCircularQueue.prototype.isEmpty = function() { 77 | if (this._head === -1 && this._tail === -1) { 78 | return true; 79 | } 80 | return false; 81 | 82 | }; 83 | 84 | 85 | MyCircularQueue.prototype.isFull = function() { 86 | const nextIndex =(this._tail + 1) % this._list.length; 87 | return nextIndex === this._head; 88 | }; 89 | 90 | /** 91 | * Your MyCircularQueue object will be instantiated and called as such: 92 | * var obj = Object.create(MyCircularQueue).createNew(k) 93 | * var param_1 = obj.enQueue(value) 94 | * var param_2 = obj.deQueue() 95 | * var param_3 = obj.Front() 96 | * var param_4 = obj.Rear() 97 | * var param_5 = obj.isEmpty() 98 | * var param_6 = obj.isFull() 99 | */ 100 | var circularQueue = new MyCircularQueue(3); 101 | // mycircularQueue.enQueue(1); 102 | // mycircularQueue.enQueue(2); 103 | // mycircularQueue.enQueue(3); 104 | // mycircularQueue.deQueue(); 105 | // mycircularQueue.enQueue(4); 106 | // mycircularQueue.enQueue(5); 107 | // mycircularQueue.enQueue(6); 108 | // MyCircularQueue circularQueue = new MycircularQueue(3); // 设置长度为 3 109 | 110 | circularQueue.enQueue(1); // 返回 true 111 | 112 | circularQueue.enQueue(2); // 返回 true 113 | 114 | circularQueue.enQueue(3); // 返回 true 115 | 116 | circularQueue.enQueue(4); // 返回 false,队列已满 117 | 118 | // circularQueue.deQueue(); 119 | // circularQueue.deQueue(); 120 | // circularQueue.deQueue(); 121 | // circularQueue.deQueue(); 122 | // circularQueue.deQueue(); 123 | 124 | circularQueue.Rear(); // 返回 3 125 | 126 | circularQueue.isFull(); // 返回 true 127 | 128 | circularQueue.deQueue(); // 返回 true 129 | 130 | circularQueue.enQueue(4); // 返回 true 131 | 132 | circularQueue.Rear(); // 返回 4 -------------------------------------------------------------------------------- /src/dataStructure/Queue.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 队列 3 | * 先进先出 4 | */ 5 | class Queue{ 6 | constructor(){ 7 | this.datastore = []; 8 | } 9 | 10 | enqueue(element){ 11 | this.datastore.push(element); 12 | } 13 | 14 | dequeue(){ 15 | return this.datastore.shift(); 16 | } 17 | 18 | isEmpty(){ 19 | return this.datastore.length === 0; 20 | } 21 | size(){ 22 | return this.datastore.length; 23 | } 24 | 25 | clear(){ 26 | this.datastore = []; 27 | } 28 | 29 | toString(){ 30 | if(this.datastore.length === 0){ 31 | console.log(''); 32 | return; 33 | } 34 | this.datastore.forEach( d => console.log(d)); 35 | } 36 | } 37 | module.exports = Queue; -------------------------------------------------------------------------------- /src/dataStructure/Stack.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 堆栈 3 | * 后进先出 4 | */ 5 | class Stack{ 6 | constructor(){ 7 | this.list = []; 8 | this.count = 0; 9 | } 10 | 11 | /** 12 | * 进栈 13 | */ 14 | push(data){ 15 | this.list[this.count] = data; 16 | this.count++; 17 | } 18 | 19 | /** 20 | * 出栈 21 | */ 22 | pop(){ 23 | if(this.count === 0){ 24 | return undefined; 25 | } 26 | this.count--; 27 | const popValue = this.list[this.count]; 28 | delete this.list[this.count]; 29 | return popValue; 30 | } 31 | 32 | /** 33 | * 获取栈顶的值 34 | * 但是不删除它 35 | */ 36 | peek(){ 37 | var topIndex = this.count -1; 38 | return this.list[topIndex]; 39 | } 40 | 41 | /** 42 | * 获取当前栈的长度 43 | */ 44 | getLength(){ 45 | return this.count; 46 | } 47 | 48 | /** 49 | * 是否为空栈 50 | */ 51 | empty(){ 52 | return this.count === 0; 53 | } 54 | 55 | clear(){ 56 | this.count = 0; 57 | this.list = []; 58 | } 59 | 60 | } 61 | module.exports = Stack; -------------------------------------------------------------------------------- /src/dataStructure/link/ListNode.js: -------------------------------------------------------------------------------- 1 | function ListNode(val) { 2 | this.val = val; 3 | this.next = null; 4 | } 5 | 6 | // 把数组转换成对应的链表 linkList 7 | function createLinkList(list) { 8 | let headNode = new ListNode(); 9 | let currentNode = headNode; 10 | 11 | const isLast = (i) => i === list.length - 1; 12 | list.forEach((val, i) => { 13 | // 先给当前的 node 赋值 14 | currentNode.val = val; 15 | 16 | // 创建下一个node ,然后赋值next指针 17 | // 最后切换 currentNode 的指针 18 | // 如果是最后一个的话 那么就不需要处理了 19 | if (isLast(i)) return; 20 | const nextNode = new ListNode(); 21 | currentNode.next = nextNode; 22 | currentNode = nextNode; 23 | }); 24 | 25 | return headNode; 26 | } 27 | 28 | module.exports = { 29 | ListNode, 30 | createLinkList, 31 | }; 32 | -------------------------------------------------------------------------------- /src/dataStructure/link/hasCycle.js: -------------------------------------------------------------------------------- 1 | // 给定一个链表,判断链表中是否有环。 2 | 3 | // 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。 4 | 5 | // 如果链表中存在环,则返回 true 。 否则,返回 false 。 6 | 7 | // 力扣(LeetCode) 8 | // 链接:https://leetcode-cn.com/problems/linked-list-cycle 9 | 10 | // 示例 1: 11 | 12 | // 3 -> 2 -> 0 -> -4 13 | // -4 -> 2 14 | const isVisit = Symbol("isVisi"); 15 | 16 | // 输入:head = [3,2,0,-4], pos = 1 17 | // 输出:true 18 | // 解释:链表中有一个环,其尾部连接到第二个节点。 19 | function hasCycle(node) { 20 | // 小步骤的开发思想 21 | let temp = node; 22 | while (temp) { 23 | if (temp.val === isVisit) { 24 | return true; 25 | } 26 | 27 | temp.val = isVisit; 28 | 29 | temp = temp.next; 30 | } 31 | 32 | return false 33 | } 34 | 35 | module.exports = { 36 | hasCycle, 37 | }; 38 | -------------------------------------------------------------------------------- /src/dataStructure/link/hasCycle.test.js: -------------------------------------------------------------------------------- 1 | const {hasCycle} = require('./hasCycle'); 2 | const { createLinkList } = require("./ListNode.js"); 3 | 4 | describe("hasCycle", () => { 5 | test("should return true when has cycle", () => { 6 | // given 7 | const head = createLinkList([3, 2, 0, -4]); 8 | const fourthNode = head.next.next.next; 9 | const secondNode = head.next; 10 | // 绑定好, 就存在环了 11 | fourthNode.next = secondNode; 12 | 13 | // when 14 | const result = hasCycle(head); 15 | 16 | // then 17 | expect(result).toBe(true); 18 | }); 19 | }); 20 | -------------------------------------------------------------------------------- /src/dataStructure/link/kthToLast.js: -------------------------------------------------------------------------------- 1 | // function kthToLast(head, k) { 2 | // // 1. 先求 len 3 | // let len = 0; 4 | // let temp = head; 5 | 6 | // while (temp) { 7 | // len++; 8 | // temp = temp.next; 9 | // } 10 | 11 | // const s = len - k; 12 | // temp = head; 13 | 14 | // for (let i = 0; i < s; i++) { 15 | // temp = temp.next; 16 | // } 17 | 18 | // return temp.val; 19 | // } 20 | 21 | function kthToLast(head, k) { 22 | let q = head; // 快指针 23 | let p = head; // 慢指针 24 | 25 | for (let i = 0; i < k; i++) { 26 | q = q.next; 27 | } 28 | 29 | while (q) { 30 | q = q.next; 31 | p = p.next; 32 | } 33 | 34 | return p.val 35 | } 36 | 37 | module.exports = { 38 | kthToLast, 39 | }; 40 | -------------------------------------------------------------------------------- /src/dataStructure/link/kthToLast.test.js: -------------------------------------------------------------------------------- 1 | const { kthToLast } = require("./kthToLast"); 2 | const { createLinkList } = require("./ListNode"); 3 | 4 | // 在链表中返回倒数第 k 个节点的值 5 | describe("kthToLast", () => { 6 | test("1,2,3,4,5,k 为 2,结果为 4 ", () => { 7 | // 获取倒数第 k 个只 8 | const head = createLinkList([1, 2, 3, 4, 5]); 9 | 10 | const k = 2; 11 | expect(kthToLast(head, k)).toBe(4); 12 | }); 13 | 14 | test("1,2,3,4,5,k 为 3,结果为 3 ", () => { 15 | // 获取倒数第 k 个只 16 | const head = createLinkList([1, 2, 3, 4, 5]); 17 | 18 | const k = 3; 19 | expect(kthToLast(head, k)).toBe(3); 20 | }); 21 | }); 22 | -------------------------------------------------------------------------------- /src/dataStructure/link/mergeTwoLists.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Definition for singly-linked list. 3 | * function ListNode(val) { 4 | * this.val = val; 5 | * this.next = null; 6 | * } 7 | */ 8 | module.exports = { 9 | ListNode, 10 | mergeTwoLists 11 | } 12 | 13 | function ListNode(val) { 14 | this.val = val; 15 | this.next = null; 16 | } 17 | 18 | /** 19 | * @param {ListNode} l1 20 | * @param {ListNode} l2 21 | * @return {ListNode} 22 | */ 23 | function mergeTwoLists (l1, l2) { 24 | let l3; 25 | while (l1) { 26 | var lastNode; 27 | if (!l3) { 28 | l3 = new ListNode(); 29 | lastNode = l3; 30 | } else { 31 | var node = new ListNode(); 32 | var tempNode = l3; 33 | while (tempNode.next) { 34 | tempNode = tempNode.next; 35 | } 36 | tempNode.next = node; 37 | lastNode = tempNode.next; 38 | } 39 | 40 | if (l1.val <= l2.val) { 41 | lastNode.val = l1.val; 42 | lastNode.next = new ListNode(l2.val); 43 | } else if (l1.val > l2.val) { 44 | lastNode.val = l2.val; 45 | lastNode.next = new ListNode(l1.val); 46 | } 47 | l1 = l1.next; 48 | l2 = l2.next; 49 | } 50 | return l3; 51 | }; -------------------------------------------------------------------------------- /src/dataStructure/link/reversalLinked.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 翻转链表 3 | */ 4 | 5 | 6 | function Node(val,next){ 7 | this.val = val; 8 | this.prev = null; 9 | this.next = null; 10 | } 11 | 12 | Node.prototype.setNext = function (node){ 13 | this.next = node; 14 | } 15 | Node.prototype.setPrev = function (node){ 16 | this.prev = node; 17 | } 18 | 19 | 20 | function reversalLinked(node){ 21 | // 1-2-3-4-5 22 | // 2-1-3-4-5 依次把node提到最前面,即完成链表的翻转 23 | // 记录第一个节点 24 | let first = node 25 | while(node){ 26 | // 记录节点的下一个,不然等会就找不到了 27 | let iNode = node.next; 28 | //通过 node 节点往上找 找到最头的那个节点 29 | let currentNode = node; 30 | while(currentNode.prev){ 31 | let prevNode = currentNode.prev; 32 | const currentNodeNext = currentNode.next; 33 | const prevNodePrev = prevNode.prev; 34 | 35 | currentNode.setPrev(prevNodePrev); 36 | currentNode.setNext(prevNode) 37 | 38 | prevNode.setPrev(currentNode); 39 | prevNode.setNext(currentNodeNext); 40 | 41 | if(currentNodeNext){ 42 | currentNodeNext.setPrev(prevNode) 43 | } 44 | } 45 | // 更新node 46 | node = iNode; 47 | } 48 | return first; 49 | } 50 | 51 | 52 | 53 | // Linked -> 1, 2, 3, 4, 5 54 | var node1 = new Node(1); 55 | var node2 = new Node(2); 56 | var node3 = new Node(3); 57 | var node4 = new Node(4); 58 | var node5 = new Node(5); 59 | 60 | node1.setNext(node2) 61 | node2.setNext(node3) 62 | node3.setNext(node4) 63 | node4.setNext(node5) 64 | 65 | 66 | node2.setPrev(node1) 67 | node3.setPrev(node2) 68 | node4.setPrev(node1) 69 | node5.setPrev(node4) 70 | 71 | 72 | reversalLinked(node1) -------------------------------------------------------------------------------- /src/dataStructure/tree/buildTree.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 从中序与后序遍历序列构造二叉树 3 | * 根据一棵树的中序遍历与后序遍历构造二叉树。 4 | * 5 | * 注意: 6 | * 你可以假设树中没有重复的元素。 7 | * 8 | * 例如,给出 9 | * 10 | * 中序遍历 inorder = [9,3,15,20,7] 11 | * 后序遍历 postorder = [9,15,7,20,3] 12 | * 13 | * 返回如下的二叉树: 14 | * 15 | * 3 16 | * / \ 17 | * 9 20 18 | * / \ 19 | * 15 7 20 | * 21 | * 22 | * Definition for a binary tree node. 23 | * function TreeNode(val) { 24 | * this.val = val; 25 | * this.left = this.right = null; 26 | * } 27 | */ 28 | /** 29 | * @param {number[]} inorder 30 | * @param {number[]} postorder 31 | * @return {TreeNode} 32 | */ 33 | 34 | function TreeNode(val) { 35 | this.val = val; 36 | this.left = this.right = null; 37 | } 38 | 39 | /** 40 | * 基于中序和后序构建树 41 | * @param {*} inorder 42 | * @param {*} postorder 43 | */ 44 | function buildTree(inorder,postorder){ 45 | if(inorder.length === 0)return null; 46 | if(inorder.length === 1)return new TreeNode(inorder[0]); 47 | let root = new TreeNode(postorder.pop()); 48 | let leftTreeNodeSum = inorder.indexOf(root.val) 49 | root.left = buildTree(inorder.slice(0,leftTreeNodeSum),postorder.slice(0,leftTreeNodeSum)); 50 | root.right = buildTree(inorder.slice(leftTreeNodeSum+1),postorder.slice(leftTreeNodeSum)) 51 | return root; 52 | } 53 | 54 | // console.log(r); 55 | // var r = buildTree([2,1],[1,2]); 56 | // var r = buildTree([1,2],[2,1]); 57 | 58 | /** 59 | * 基于前序和中序构建树 60 | */ 61 | function buildTree1(preorder, inorder){ 62 | if(preorder.length === 0)return null; 63 | if(preorder.length === 1)return new TreeNode(preorder[0]); 64 | var root = new TreeNode(preorder[0]); 65 | var leftTreeNodeSum = inorder.indexOf(root.val); 66 | root.left = buildTree1(preorder.slice(1,leftTreeNodeSum + 1),inorder.slice(0,leftTreeNodeSum)); 67 | root.right = buildTree1(preorder.slice(leftTreeNodeSum + 1),inorder.slice(leftTreeNodeSum + 1)); 68 | return root; 69 | } 70 | 71 | var r = buildTree1([3,9,20,15,7],[9,3,15,20,7]); 72 | console.log(r); -------------------------------------------------------------------------------- /src/dataStructure/tree/connect.js: -------------------------------------------------------------------------------- 1 | // 填充每个节点的下一个右侧节点指针 2 | // 给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下: 3 | // 4 | // struct Node { 5 | // int val; 6 | // Node *left; 7 | // Node *right; 8 | // Node *next; 9 | // } 10 | // 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。 11 | // 12 | // 初始状态下,所有 next 指针都被设置为 NULL。 13 | 14 | 15 | /** 16 | * // Definition for a Node. 17 | * function Node(val,left,right,next) { 18 | * this.val = val; 19 | * this.left = left; 20 | * this.right = right; 21 | * this.next = next; 22 | * }; 23 | */ 24 | /** 25 | * @param {Node} root 26 | * @return {Node} 27 | */ 28 | var connect = function(root) { 29 | // 使用 bfs 解题 30 | let queue = []; 31 | queue.push(root); 32 | 33 | while(queue.length > 0){ 34 | let len = queue.length; 35 | for(let i=0; i= len? null : queue[i + 1] 38 | node.left && queue.push(node.left); 39 | node.right && queue.push(node.right); 40 | } 41 | queue = queue.slice(len); 42 | } 43 | console.log(root) 44 | }; 45 | 46 | 47 | 48 | function Node(val,left,right,next) { 49 | this.val = val; 50 | this.left = left; 51 | this.right = right; 52 | this.next = next; 53 | }; 54 | 55 | 56 | var node1 = new Node(1); 57 | var node2 = new Node(2); 58 | var node3 = new Node(3); 59 | var node4 = new Node(4); 60 | var node5 = new Node(5); 61 | var node6 = new Node(6); 62 | var node7 = new Node(7); 63 | 64 | 65 | node1.left = node2; 66 | node1.right = node3; 67 | 68 | node2.left = node4; 69 | node2.right = node5; 70 | 71 | node3.left = node6; 72 | node3.right = node7; 73 | 74 | 75 | connect(node1); 76 | 77 | -------------------------------------------------------------------------------- /src/dataStructure/tree/hasPathSum.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。 3 | * 4 | * 说明: 叶子节点是指没有子节点的节点。 5 | * 6 | * 示例: 7 | * 给定如下二叉树,以及目标和 sum = 22, 8 | * 9 | * 5 10 | * / \ 11 | * 4 8 12 | * / / \ 13 | * 11 13 4 14 | * / \ \ 15 | * 7 2 1 16 | * 返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。 17 | * Definition for a binary tree node. 18 | * function TreeNode(val) { 19 | * this.val = val; 20 | * this.left = this.right = null; 21 | * } 22 | */ 23 | /** 24 | * @param {TreeNode} root 25 | * @param {number} sum 26 | * @return {boolean} 27 | */ 28 | var hasPathSum = function(root, sum) { 29 | const rHash = {}; 30 | const f = (node,list)=>{ 31 | if(!node)return; 32 | 33 | list.push(node.val); 34 | if(!node.left && !node.right) 35 | { 36 | var key =list.reduce((total,num)=>{return total+=num},0) 37 | 38 | rHash[key] = 1; 39 | } 40 | 41 | f(node.left,list) 42 | f(node.right,list) 43 | list.pop(); 44 | } 45 | let list = []; 46 | f(root,list) 47 | 48 | return Boolean(rHash[sum]) 49 | }; -------------------------------------------------------------------------------- /src/dataStructure/tree/inorderTraversal.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 中序 3 | * Definition for a binary tree node. 4 | * function TreeNode(val) { 5 | * this.val = val; 6 | * this.left = this.right = null; 7 | * } 8 | */ 9 | class TreeNode{ 10 | constructor(val){ 11 | this.val = val; 12 | this._left = this._right = null; 13 | } 14 | 15 | get left(){ 16 | return this._left; 17 | } 18 | 19 | set left(val){ 20 | this._left = val; 21 | } 22 | 23 | get right(){ 24 | return this._right; 25 | } 26 | 27 | set right(val){ 28 | this._right = val; 29 | } 30 | } 31 | 32 | const tree1 = new TreeNode(1); 33 | const tree2 = new TreeNode(2); 34 | const tree3 = new TreeNode(3); 35 | const tree4 = new TreeNode(4); 36 | const tree5 = new TreeNode(5); 37 | const tree6 = new TreeNode(6); 38 | const tree7 = new TreeNode(7); 39 | 40 | tree1.left = tree2; 41 | tree1.right = tree3; 42 | 43 | tree2.left = tree4; 44 | tree2.right = tree5; 45 | 46 | tree3.left = tree6; 47 | tree3.right = tree7 48 | 49 | 50 | 51 | 52 | /** 53 | * @param {TreeNode} root 54 | * @return {number[]} 55 | */ 56 | var inorderTraversal = function(root) { 57 | 58 | var r = []; 59 | const iteration = (node)=>{ 60 | if (!node) return; 61 | 62 | 63 | iteration(node.left); 64 | r.push(node.val); 65 | 66 | iteration(node.right); 67 | } 68 | iteration(root) 69 | return r; 70 | 71 | }; 72 | 73 | 74 | var inorderTraversal1 = function(root){ 75 | //1. 有左向左,没左出栈,打印父节点 接着走右 76 | 77 | let stack = []; 78 | 79 | let node = root; 80 | 81 | while(node || stack.length > 0){ 82 | 83 | if(node){ 84 | stack.push(node) 85 | } 86 | 87 | let leftNode = node && node.left; 88 | while(leftNode){ 89 | stack.push(leftNode) 90 | leftNode = leftNode.left; 91 | } 92 | 93 | console.log(stack[stack.length -1].val) 94 | //没左了 95 | let parentNode = stack.pop(); 96 | 97 | node = parentNode.right; 98 | 99 | } 100 | } 101 | inorderTraversal1(tree1) -------------------------------------------------------------------------------- /src/dataStructure/tree/isSymmetric.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 对称二叉树 3 | * 给定一个二叉树,检查它是否是镜像对称的。 4 | * 5 | * 例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 6 | * 7 | * 1 8 | * / \ 9 | * 2 2 10 | * / \ / \ 11 | * 3 4 4 3 12 | * 但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 13 | * 14 | * 1 15 | * / \ 16 | * 2 2 17 | * \ \ 18 | * 3 3 19 | * 说明: 20 | * 21 | * 如果你可以运用递归和迭代两种方法解决这个问题,会很加分。 22 | * Definition for a binary tree node. 23 | * function TreeNode(val) { 24 | * this.val = val; 25 | * this.left = this.right = null; 26 | * } 27 | */ 28 | class TreeNode { 29 | constructor(val) { 30 | this.val = val; 31 | this._left = this._right = null; 32 | } 33 | 34 | get left() { 35 | return this._left; 36 | } 37 | 38 | set left(val) { 39 | this._left = val; 40 | } 41 | 42 | get right() { 43 | return this._right; 44 | } 45 | 46 | set right(val) { 47 | this._right = val; 48 | } 49 | } 50 | 51 | const tree1 = new TreeNode(1); 52 | const tree2 = new TreeNode(2); 53 | const tree3 = new TreeNode(2); 54 | const tree4 = new TreeNode(3); 55 | const tree5 = new TreeNode(4); 56 | const tree6 = new TreeNode(4); 57 | const tree7 = new TreeNode(3); 58 | 59 | 60 | // tree1.left = tree2; 61 | // tree1.right = tree3; 62 | 63 | // tree2.left = tree4; 64 | // tree2.right = tree5; 65 | 66 | // tree3.left = tree6; 67 | // tree3.right = tree7; 68 | 69 | tree1.left = tree2; 70 | tree1.right = tree3; 71 | 72 | tree2.right = tree4; 73 | 74 | tree3.right = tree7; 75 | 76 | /** 77 | * @param {TreeNode} root 78 | * @return {boolean} 79 | */ 80 | var isSymmetric = function(root) { 81 | if(!root)return true; 82 | 83 | const f = (node1,node2)=>{ 84 | if(!node1 && !node2)return true; 85 | 86 | if(node1 && node2 && node1.val === node2.val){ 87 | var boo1 = f(node1.left,node2.right) 88 | var boo2 = f(node1.right,node2.left) 89 | return boo1 && boo2; 90 | } 91 | 92 | return false; 93 | } 94 | var r = f(root.left,root.right) 95 | console.log(r); 96 | }; 97 | 98 | 99 | var isSymmetric1 = function(root){ 100 | //迭代实现 101 | // 使用 BFS 解题 102 | // 每一层 -》 list 103 | // 对比list 0 === list.length - 1 ; 1 === list.length - 2 104 | 105 | let queue = []; 106 | 107 | queue.push(root); 108 | 109 | let count = 0; 110 | while(queue.length > 0){ 111 | let len = queue.length; 112 | const list = []; 113 | count++ 114 | for(let i=0; i 0){ 123 | console.log(`count:${count} list:${list}`) 124 | // 对比 list 125 | if(list.length > 1){ 126 | // 2个节点得时候在开始比对 127 | let mid = list.length / 2; 128 | let len = list.length - 1; 129 | for(let i=0; i 0){ 39 | 40 | let layer = []; 41 | // 基于当前队列得长度遍历 42 | // 不可以直接写 i maxDeep) { 78 | maxDeep = deep; 79 | } 80 | } 81 | f(node.left, deep + 1) 82 | f(node.right, deep + 1) 83 | } 84 | 85 | f(root, 1) 86 | return maxDeep; 87 | }; 88 | 89 | 90 | var maxDepth1 = function(root){ 91 | // 自底向上 92 | // 后序 -》 对比左右节点,取最大值 93 | // 对于树中的任意一个节点,如果你知道它子节点的答案,你能计算出该节点的答案吗? 如果答案是肯定的,那么 “自底向上” 的递归可能是一个不错的解决方法。 94 | const f = function(node){ 95 | // 叶子节点为0 96 | if(!node)return 0; 97 | const leftDeep = f(node.left) 98 | const rightDeep = f(node.right) 99 | return Math.max(leftDeep,rightDeep) + 1 100 | } 101 | return f(root); 102 | } 103 | 104 | 105 | // maxDepth(tree1) 106 | maxDepth1(tree1) -------------------------------------------------------------------------------- /src/dataStructure/tree/postorderTraversal.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 二叉树的后序遍历 3 | * 给定一个二叉树,返回它的 后序 遍历。 4 | * 5 | * 示例: 6 | * 7 | * 输入: [1,null,2,3] 8 | * 1 9 | * \ 10 | * 2 11 | * / 12 | * 3 13 | * 14 | * 输出: [3,2,1] 15 | * 16 | * 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 17 | * 18 | * Definition for a binary tree node. 19 | * function TreeNode(val) { 20 | * this.val = val; 21 | * this.left = this.right = null; 22 | * } 23 | */ 24 | class TreeNode{ 25 | constructor(val){ 26 | this.val = val; 27 | this._left = this._right = null; 28 | } 29 | 30 | get left(){ 31 | return this._left; 32 | } 33 | 34 | set left(val){ 35 | this._left = val; 36 | } 37 | 38 | get right(){ 39 | return this._right; 40 | } 41 | 42 | set right(val){ 43 | this._right = val; 44 | } 45 | } 46 | 47 | const tree1 = new TreeNode(1); 48 | const tree2 = new TreeNode(2); 49 | const tree3 = new TreeNode(3); 50 | const tree4 = new TreeNode(4); 51 | const tree5 = new TreeNode(5); 52 | const tree6 = new TreeNode(6); 53 | const tree7 = new TreeNode(7); 54 | 55 | tree1.left = tree2; 56 | tree1.right = tree3; 57 | 58 | tree2.left = tree4; 59 | tree2.right = tree5; 60 | 61 | tree3.left = tree6; 62 | tree3.right = tree7 63 | 64 | 65 | 66 | 67 | /** 68 | * @param {TreeNode} root 69 | * @return {number[]} 70 | */ 71 | var postorderTraversal = function(root) { 72 | 73 | 74 | const iteration = function(node){ 75 | if(!node)return; 76 | iteration(node.left) 77 | iteration(node.right) 78 | console.log(node.val); 79 | } 80 | 81 | iteration(root); 82 | }; 83 | 84 | 85 | var postorderTraversal1 = function(root){ 86 | // 使用 两个栈来处理后序遍历 -》 1个栈处理节点的跳转 另外一个栈存储节点 87 | const stack1 = []; 88 | const stack2 = []; 89 | 90 | let node = root; 91 | while(node || stack1.length > 0){ 92 | 93 | if(node){ 94 | stack1.push(node); 95 | stack2.push(node); 96 | } 97 | //1 .一路向右 98 | let rightNode = node && node.right; 99 | while(rightNode){ 100 | stack1.push(rightNode) 101 | stack2.push(rightNode) 102 | rightNode = rightNode.right; 103 | } 104 | 105 | //2. 右侧没有的时候,弹出栈顶节点,把当前节点指向栈顶节点的左侧节点 106 | node = stack1.pop().left; 107 | } 108 | 109 | while(stack2.length > 0){ 110 | console.log(stack2.pop().val); 111 | } 112 | 113 | 114 | } 115 | 116 | postorderTraversal1(tree1) -------------------------------------------------------------------------------- /src/dataStructure/tree/preorderTraversal.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 二叉树的前序遍历 3 | * 4 | * 5 | * 给定一个二叉树,返回它的 前序 遍历。 6 | * 7 | * 示例: 8 | * 9 | * 输入: [1,null,2,3] 10 | * 1 11 | * \ 12 | * 2 13 | * / 14 | * 3 15 | * 16 | * 输出: [1,2,3] 17 | * 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 18 | * 19 | * Definition for a binary tree node. 20 | * function TreeNode(val) { 21 | * this.val = val; 22 | * this.left = this.right = null; 23 | * } 24 | */ 25 | /** 26 | * @param {TreeNode} root 27 | * @return {number[]} 28 | */ 29 | 30 | class TreeNode{ 31 | constructor(val){ 32 | this.val = val; 33 | this._left = this._right = null; 34 | } 35 | 36 | get left(){ 37 | return this._left; 38 | } 39 | 40 | set left(val){ 41 | this._left = val; 42 | } 43 | 44 | get right(){ 45 | return this._right; 46 | } 47 | 48 | set right(val){ 49 | this._right = val; 50 | } 51 | } 52 | 53 | const tree1 = new TreeNode(1); 54 | const tree2 = new TreeNode(2); 55 | const tree3 = new TreeNode(3); 56 | const tree4 = new TreeNode(4); 57 | const tree5 = new TreeNode(5); 58 | const tree6 = new TreeNode(6); 59 | const tree7 = new TreeNode(7); 60 | 61 | tree1.left = tree2; 62 | tree1.right = tree3; 63 | 64 | tree2.left = tree4; 65 | tree2.right = tree5; 66 | 67 | tree3.left = tree6; 68 | tree3.right = tree7 69 | /** 70 | * 递归 71 | * @param {} root 72 | */ 73 | var preorderTraversal = function(root) { 74 | if(!root)return; 75 | console.log(root.val); 76 | preorderTraversal(root.left); 77 | preorderTraversal(root.right); 78 | }; 79 | 80 | 81 | /** 82 | * 迭代 83 | * @param {} root 84 | */ 85 | var preorderTraversal1 = function(root) { 86 | 87 | const stack = []; 88 | 89 | let node = root; 90 | // node 是为了第一次进循环 91 | // 栈不为空,说明还有逻辑要执行,同调用栈的原理 92 | while(node || stack.length > 0){ 93 | if(node){ 94 | console.log(node.val) 95 | stack.push(node); 96 | } 97 | let nextNode = node && node.left 98 | while(nextNode){ 99 | console.log(nextNode.val); 100 | stack.push(nextNode); 101 | nextNode = nextNode.left; 102 | } 103 | // 重点;需要回到父元素的右节点 104 | node = stack.pop().right; 105 | } 106 | 107 | }; 108 | 109 | preorderTraversal1(tree1); -------------------------------------------------------------------------------- /src/dataStructure/tree/serialize.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 二叉树的序列化与反序列化 3 | * 4 | * 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。 5 | * 6 | * 请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。 7 | * 8 | * 示例: 9 | * 10 | * 你可以将以下二叉树: 11 | * 12 | * 1 13 | * / \ 14 | * 2 3 15 | * / \ 16 | * 4 5 17 | * 18 | * 序列化为 "[1,2,3,null,null,4,5]" 19 | * 提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。 20 | * 21 | * 说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。 22 | * Definition for a binary tree node. 23 | * function TreeNode(val) { 24 | * this.val = val; 25 | * this.left = this.right = null; 26 | * } 27 | */ 28 | 29 | function TreeNode(val) { 30 | this.val = val; 31 | this.left = this.right = null; 32 | } 33 | let t1 = new TreeNode(1); 34 | let t2 = new TreeNode(2); 35 | let t3 = new TreeNode(3); 36 | let t4 = new TreeNode(4); 37 | let t5 = new TreeNode(5); 38 | 39 | 40 | t1.left = t2; 41 | t1.right = t3; 42 | 43 | t3.left = t4; 44 | t3.right = t5; 45 | /* 46 | * Encodes a tree to a single string. 47 | * 48 | * @param {TreeNode} root 49 | * @return {string} 50 | */ 51 | var serialize = function(root) { 52 | if(!root)return []; 53 | let stack = []; 54 | stack.push(root); 55 | let serializeStr = [] 56 | while(stack.length > 0){ 57 | let len = stack.length; 58 | 59 | for(let i=0; i=0; i--){ 72 | if(serializeStr[i]){ 73 | endIndex = i; 74 | break; 75 | } 76 | } 77 | let str = serializeStr.slice(0,endIndex + 1).map(node => node? node.val:"null").join(",") 78 | return str?`[${str}]`:"[]" 79 | }; 80 | 81 | 82 | 83 | /** 84 | * Decodes your encoded data to tree. 85 | * 86 | * @param {string} data 87 | * @return {TreeNode} 88 | */ 89 | var deserialize = function(data) { 90 | if(!data)return null; 91 | let treeList = data.slice(1,data.length - 1).split(",").map(s => s === "null"? null:Number(s)) 92 | treeList.unshift(0) 93 | let hash = {}; 94 | for (let i = 1, len = treeList.length; i < len; i++) { 95 | if (treeList[i]) { 96 | var node 97 | if(!hash[i]){ 98 | node = new TreeNode(treeList[i]) 99 | hash[i] = node; 100 | }else{ 101 | node = hash[i] 102 | } 103 | 104 | if (treeList[i * 2]) { 105 | node.left = new TreeNode(treeList[i * 2]); 106 | hash[i * 2] = node.left; 107 | } 108 | if (treeList[i * 2 + 1]){ 109 | node.right = new TreeNode(treeList[i * 2 + 1]); 110 | hash[i * 2 + 1] = node.right; 111 | } 112 | } 113 | } 114 | return hash[1]?hash[1]:[] 115 | }; 116 | 117 | var dr = deserialize('[null]') 118 | console.log(dr) 119 | var r = serialize([null]) 120 | console.log(r) 121 | 122 | 123 | /** 124 | * Your functions will be called as such: 125 | * deserialize(serialize(root)); 126 | */ -------------------------------------------------------------------------------- /src/dynamicPlanning/first.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 假设我们有一个 n 乘以 n 的矩阵 w[n][n]。 3 | * 矩阵存储的都是正整数。棋子起始位置在左上角,终止位置在右下角。 4 | * 我们将棋子从左上角移动到右下角。 5 | * 每次只能向右或者向下移动一位。 6 | * 从左上角到右下角,会有很多不同的路径可以走。 7 | * 我们把每条路径经过的数字加起来看作路径的长度。 8 | * 那从左上角移动到右下角的最短路径长度是多少呢? 9 | */ 10 | //[[1,3,5,9], 11 | // [2,1,3,4] 12 | // [5,2,6,7], 13 | // [6,8,4,3]] 14 | var rect = [[1, 3, 5, 9], 15 | [2, 1, 3, 4], 16 | [5, 2, 6, 7], 17 | [6, 8, 4, 3]] 18 | 19 | 20 | function optPath(rect,i,j){ 21 | //公式: opt(i,j) = rect[i,j] + min(opt(i - 1,j),opt(i,j - 1)); 22 | //终止: i == 0 && j == 0 -> 到达终点 23 | // i < 0 || j < 0 -> 超出边界的没有意义 无需计算 24 | 25 | if(i < 0 || j < 0)return 0; 26 | if(i === 0 && j === 0)return rect[i][j]; 27 | 28 | const upV = optPath(rect,i,j - 1); 29 | const leftV = optPath(rect,i - 1, j); 30 | return rect[i][j] + Math.min(upV,leftV); 31 | } 32 | console.log(optPath(rect,3,3)); 33 | 34 | function optPath1(rect,n){ 35 | //动态规划实现法 36 | //状态转移表法 37 | let sum = 0; 38 | let matrix = []; 39 | for(let i=0; i d || distance[v] === undefined){ 74 | distance[v] = d; 75 | parents[v] = currentV["v"] 76 | } 77 | priorityList.push({ d, v }) 78 | } 79 | visited[currentV['v']] = true; 80 | 81 | } 82 | } 83 | 84 | 85 | //todo 优先级队列,后面需要用 堆 来实现 86 | //基于 {"v":"xx","d":0} d 值来排序越小优先级越高 87 | var PriorityList = { 88 | _list:[], 89 | push(info){ 90 | this._list.push(info); 91 | this._list.sort((objA,objB)=>{ 92 | return objA.d - objB.d 93 | }) 94 | }, 95 | pop(){ 96 | return this._list.shift(); 97 | }, 98 | isEmpty(){ 99 | return this._list.length === 0 100 | } 101 | } 102 | 103 | dijkstra(graph,"A"); -------------------------------------------------------------------------------- /src/graph/topoSort.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 拓扑排序 3 | * 凡是需要通过局部顺序来推导全局顺序的,一般都能用拓扑排序来解决 4 | * 还可以用来检测环的存在 5 | */ 6 | const Graph = require('../dataStructure/Graph.js'); 7 | const Queue = require('../dataStructure/Queue.js'); 8 | let graph = new Graph(); 9 | graph.add('内裤',"裤子"); 10 | graph.add('内裤',"鞋子"); 11 | graph.add('裤子',"鞋子"); 12 | graph.add('裤子',"腰带"); 13 | graph.add('袜子',"鞋子"); 14 | graph.add('鞋子',""); 15 | graph.add('衬衣',"外套"); 16 | graph.add('衬衣',"领带"); 17 | graph.add('领带',""); 18 | graph.add('外套',""); 19 | graph.add('腰带',""); 20 | /** 21 | * kahn算法 22 | * 利用贪心算法思想 23 | */ 24 | 25 | function topoSortByKahn(){ 26 | //先计算出每个顶点的入度值来 27 | let degreeList = {} 28 | let linkedList = graph.getLinkedList(); 29 | for(let key in linkedList){ 30 | degreeList[key] = 0; 31 | } 32 | 33 | for(let key in linkedList){ 34 | let arr = linkedList[key]; 35 | for(let i=0; i< arr.length; i++){ 36 | if(arr[i]){ 37 | degreeList[arr[i]] += 1; 38 | } 39 | } 40 | } 41 | //拿出入度值为0的顶点放入队列内 42 | const queue = new Queue(); 43 | for(let key in degreeList){ 44 | if(degreeList[key] === 0) 45 | { 46 | queue.enqueue(key) 47 | } 48 | } 49 | 50 | while(!queue.isEmpty()) 51 | { 52 | let v = queue.dequeue(); 53 | console.log(v); 54 | //需要把和这个顶点 有关的 顶点的入度全部减一 55 | const list = linkedList[v]; 56 | for(let i=0; i t 改为 t -> s 76 | //这是因为使用递归(递归需要进入到最深处,然后在回来) 77 | let linkedList = graph.getLinkedList(); 78 | 79 | let reversalList = {}; 80 | for(let key in linkedList){ 81 | reversalList[key] = []; 82 | } 83 | for(let key in linkedList){ 84 | let list = linkedList[key] 85 | for(let i=0; i{ 100 | visited[node] = true; 101 | for (let i = 0; i < list.length; i++) { 102 | if (!visited[list[i]]) { 103 | dfs(node,reversalList[list[i]]); 104 | } 105 | } 106 | //最后在打印自己 107 | console.log(node) 108 | } 109 | for(let key in reversalList){ 110 | const list = reversalList[key] 111 | dfs(key,list) 112 | } 113 | } -------------------------------------------------------------------------------- /src/js/curry.js: -------------------------------------------------------------------------------- 1 | 2 | var fn = curry(function(a, b, c) { 3 | console.log([a, b, c]); 4 | }); 5 | 6 | fn("a", "b", "c") // ["a", "b", "c"] 7 | fn("a", "b")("c") // ["a", "b", "c"] 8 | fn("a")("b")("c") // ["a", "b", "c"] 9 | fn("a")("b", "c") // ["a", "b", "c"] 10 | 11 | /** 12 | * 实现原理是 当参数积累到和 fn 的参数一样的时候,回调 fn 13 | * @param {*} fn 14 | * @param {*} args 15 | */ 16 | function curry(fn,args){ 17 | 18 | let length = fn.length; 19 | args = args || []; 20 | return function(){ 21 | let _args = [...args,...arguments] 22 | 23 | if(_args.length < length){ 24 | return curry.call(this,fn,_args) 25 | }else{ 26 | // 因为 _args 是数组 27 | // 所以使用 apply 展开数组 28 | return fn.apply(this,_args) 29 | } 30 | } 31 | 32 | } -------------------------------------------------------------------------------- /src/js/deepClone.js: -------------------------------------------------------------------------------- 1 | /** 2 | * js 语言的特定算法 3 | * 对象的深复制 4 | */ 5 | 6 | 7 | function deepClone(obj){ 8 | 9 | if(!obj)return; 10 | 11 | let newObj = Array.isArray(obj)? []:{}; 12 | 13 | 14 | for(let key in obj){ 15 | if(typeof obj[key] === "object" ) 16 | { 17 | newObj[key] = deepClone(obj[key]); 18 | }else{ 19 | newObj[key] = obj[key] 20 | } 21 | } 22 | 23 | return newObj; 24 | } 25 | 26 | var obj = { 27 | name : "cxr", 28 | list : [1,2,3], 29 | info:{ 30 | title: "heiheihei" 31 | } 32 | } 33 | console.log(deepClone(obj)); -------------------------------------------------------------------------------- /src/leetcode/1.two-sum.js: -------------------------------------------------------------------------------- 1 | /* 2 | * [1] Two Sum 3 | * 4 | * https://leetcode.com/problems/two-sum/description/ 5 | * 6 | * algorithms 7 | * Easy (38.72%) 8 | * Total Accepted: 1M 9 | * Total Submissions: 2.7M 10 | * Testcase Example: '[2,7,11,15]\n9' 11 | * 12 | * Given an array of integers, return indices of the two numbers such that they 13 | * add up to a specific target. 14 | * 15 | * You may assume that each input would have exactly one solution, and you may 16 | * not use the same element twice. 17 | * 18 | * Example: 19 | * 20 | * 21 | * Given nums = [2, 7, 11, 15], target = 9, 22 | * 23 | * Because nums[0] + nums[1] = 2 + 7 = 9, 24 | * return [0, 1]. 25 | * 26 | * 27 | * 28 | * 29 | */ 30 | /** 31 | * @param {number[]} nums 32 | * @param {number} target 33 | * @return {number[]} 34 | */ 35 | var twoSum = function(nums, target) { 36 | //遍历筛选 target - nums[n] = f (需要查找的值) 37 | //如果 f 在 nums 内的话,返回其 n 和 f 的索引值 38 | //利用 哈希查找为 O(1) 的特性 39 | //最终的时间复杂度为 O(n) 40 | const hash = {}; 41 | const len = nums.length; 42 | for(let i=0; i a + b = -c 19 | // 3个数相加 转化为 2个数相加问题 20 | //1. 排序,排序后可以基于指针的左右移动,减小复杂度 21 | const result = []; 22 | nums.sort( (a,b)=>{return a - b}) 23 | for (let i = 0, len = nums.length - 2; i < len; i++) { 24 | // nums[i] <= nums[i - 1] 意味这现在得值不能等于之前的值,因为之前的值已经处理过了(不然会造成重复) 25 | if(i !==0 && nums[i] <= nums[i - 1])continue; 26 | const c = nums[i] * -1; 27 | let j = i + 1; 28 | let k = nums.length - 1; 29 | while (j < k) { 30 | if (nums[j] + nums[k] > c) { 31 | k--; 32 | } else if (nums[j] + nums[k] < c) { 33 | j++; 34 | } else { 35 | const arr = [nums[i], nums[j], nums[k]]; 36 | result.push(arr) 37 | //重复的值用掉后就需要指向一个新的值 38 | k--; 39 | j++; 40 | while( j < k && nums[j] === nums[j - 1]){ 41 | j++; 42 | i = j 43 | } 44 | 45 | while( k > j && nums[k] === nums[k + 1]){ 46 | k--; 47 | } 48 | } 49 | } 50 | } 51 | return result; 52 | }; 53 | 54 | // threeSum([-1, 0, 1, 2, -1, -4]); 55 | // threeSum([0,0,0,0]) 56 | // threeSum([-2,0,1,1,2]) 57 | threeSum([-1,0,1,2,-1,-4]) -------------------------------------------------------------------------------- /src/leetcode/169.majorityElement.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 3 | * 4 | * 你可以假设数组是非空的,并且给定的数组总是存在众数。 5 | * 6 | * 示例 1: 7 | * 8 | * 输入: [3,2,3] 9 | * 输出: 3 10 | * 11 | * 示例 2: 12 | * 13 | * 输入: [2,2,1,1,1,2,2] 14 | * 输出: 2 15 | * 16 | * @param {number[]} nums 17 | * 18 | * @return {number} 19 | */ 20 | var majorityElement = function(nums) { 21 | //hash 实现法 22 | let hash = Object.create(null); 23 | for(let num of nums){ 24 | if(hash[num] === undefined) 25 | { 26 | hash[num] = 0; 27 | } 28 | hash[num] += 1; 29 | } 30 | 31 | let max; 32 | let majority; 33 | for(let key in hash){ 34 | 35 | if(!max || max < hash[key]){ 36 | max = hash[key]; 37 | majority = +key 38 | } 39 | } 40 | return majority 41 | 42 | 43 | }; 44 | // majorityElement([3,2,3]) 45 | // majorityElement( 46 | // [2, 2, 1, 1, 1, 2, 2] 47 | // ) 48 | 49 | 50 | var majorityElement1 = function (nums){ 51 | //摩尔投票算法 52 | //两个不同元素之间互相抵消,最后剩下的那个元素就是出现的最多的 53 | let majority = nums[0]; 54 | let count = 1; 55 | for(let i=1,len=nums.length; i 4 -> 3) + (5 -> 6 -> 4) 25 | * Output: 7 -> 0 -> 8 26 | * Explanation: 342 + 465 = 807. 27 | * 28 | * 29 | */ 30 | /** 31 | * Definition for singly-linked list. 32 | * function ListNode(val) { 33 | * this.val = val; 34 | * this.next = null; 35 | * } 36 | */ 37 | /** 38 | * @param {ListNode} l1 39 | * @param {ListNode} l2 40 | * @return {ListNode} 41 | */ 42 | var addTwoNumbers = function(l1, l2) { 43 | var p = l1; 44 | var q = l2; 45 | //虚拟头节点 46 | var dummyHead = new ListNode(null); 47 | var curr = dummyHead; 48 | //进位记录值 49 | var carry = 0; 50 | //循环条件 51 | while(p || q){ 52 | var x = p? p.val: 0; 53 | var y = q? q.val: 0; 54 | //这里需要加上之前的进位 55 | var sum = x + y + carry; 56 | // 取个位数的数字(取模) 57 | curr.next = new ListNode(sum % 10) 58 | curr = curr.next; 59 | p = p && p.next; 60 | q = q && q.next; 61 | //记录进位的值,在下次循环中需要加上 62 | carry = Math.floor(sum/ 10) 63 | } 64 | //处理最后一个节点会造成进位的情况 65 | if(carry >= 1){ 66 | curr.next = new ListNode(carry); 67 | } 68 | return dummyHead.next; 69 | 70 | }; 71 | function ListNode(val){ 72 | this.val = val; 73 | this.next = null; 74 | } -------------------------------------------------------------------------------- /src/leetcode/278.isBadVersion.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。 3 | * 4 | * 假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。 5 | * 6 | * 你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。 7 | * 8 | * 示例: 9 | * 10 | * 给定 n = 5,并且 version = 4 是第一个错误的版本。 11 | * 12 | * 调用 isBadVersion(3) -> false 13 | * 调用 isBadVersion(5) -> true 14 | * 调用 isBadVersion(4) -> true 15 | * 16 | * 所以,4 是第一个错误的版本。 17 | * 18 | * 19 | * Definition for isBadVersion() 20 | * 21 | * @param {integer} version number 22 | * @return {boolean} whether the version is bad 23 | // * isBadVersion = function(version) { 24 | // * ... 25 | // * }; 26 | */ 27 | 28 | /** 29 | * @param {function} isBadVersion() 30 | * @return {function} 31 | */ 32 | var solution = function(isBadVersion) { 33 | /** 34 | * @param {integer} n Total versions 35 | * @return {integer} The first bad version 36 | */ 37 | return function(n) { 38 | let l = 1; 39 | let r = n; 40 | 41 | while(l < r){ 42 | let mid = l + ((r - l) >> 1); 43 | if(isBadVersion(mid)){ 44 | r = mid; 45 | }else{ 46 | l = mid + 1; 47 | } 48 | } 49 | return r; 50 | } 51 | 52 | }; 53 | 54 | 55 | var isBadVersion = function(version) { 56 | return version >= 5; 57 | }; 58 | const f = solution(isBadVersion) 59 | const r = f(10) 60 | 61 | console.log(r) -------------------------------------------------------------------------------- /src/leetcode/33.search.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 33. 搜索旋转排序数组 3 | * 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 4 | * 5 | * ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 6 | * 7 | * 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。 8 | * 9 | * 你可以假设数组中不存在重复的元素。 10 | * 11 | * 你的算法时间复杂度必须是 O(log n) 级别。 12 | * 13 | * 示例 1: 14 | * 15 | * 输入: nums = [4,5,6,7,0,1,2], target = 0 16 | * 输出: 4 17 | * 18 | * 示例 2: 19 | * 20 | * 输入: nums = [4,5,6,7,0,1,2], target = 3 21 | * 输出: -1 22 | * 23 | * @param {number[]} nums 24 | * @param {number} target 25 | * @return {number} 26 | */ 27 | var search = function(nums, target) { 28 | if(!nums)return -1; 29 | 30 | 31 | let l = 0; 32 | let r = nums.length -1; 33 | while(l <= r){ 34 | let mid = l + ((r - l) >> 1); 35 | 36 | if(nums[l] === target)return l; 37 | if(nums[r] === target)return r; 38 | if(nums[mid] === target) return mid; 39 | // 看下 nums[l] 是否小于 nums[mid] 如果小于,说明左侧是有序的 40 | if( nums[l] < nums[mid]){ 41 | // 检测要查找的值是否在其范围内 42 | if(nums[l] < target && target < nums[mid] ) 43 | { 44 | r = mid - 1; 45 | }else{ 46 | l = mid + 1; 47 | } 48 | 49 | }else{ 50 | // 不然就检测右侧 51 | // 检测要查找的值是否在其范围内 52 | if(nums[mid] < target && target < nums[r] ) 53 | { 54 | l = mid + 1; 55 | }else{ 56 | r = mid - 1; 57 | } 58 | } 59 | } 60 | return -1; 61 | }; 62 | 63 | search([4,5,6,7,0,1,2],3) -------------------------------------------------------------------------------- /src/leetcode/cloneGraph.js: -------------------------------------------------------------------------------- 1 | var graph = {"$id":"1","neighbors":[{"$id":"2","neighbors":[{"$ref":"1"},{"$id":"3","neighbors":[{"$ref":"2"},{"$id":"4","neighbors":[{"$ref":"3"},{"$ref":"1"}],"val":4}],"val":3}],"val":2},{"$ref":"4"}],"val":1} 2 | 3 | /** 4 | * // Definition for a Node. 5 | * function Node(val,neighbors) { 6 | * this.val = val; 7 | * this.neighbors = neighbors; 8 | * }; 9 | */ 10 | /** 11 | * @param {Node} node 12 | * @return {Node} 13 | */ 14 | function Node(val, neighbors,id) { 15 | this.val = val; 16 | this.neighbors = []; 17 | }; 18 | 19 | Node.prototype.add = function(node){ 20 | this.neighbors.push(node) 21 | } 22 | 23 | /** 24 | * @param {*} node 25 | */ 26 | var cloneGraph = function(headNode) { 27 | let visited = {}; 28 | let hash = Object.create(null) 29 | let DFS = (node,infoList) => { 30 | if(!visited[node.val]){ 31 | visited[node.val] = true; 32 | let neighbors = []; 33 | //初始化所有的node 34 | hash[node.val] = new Node(node.val) 35 | for(let i=0; i{ 48 | let node = hash[info.val]; 49 | info.neighbors.forEach((n)=>{ 50 | node.add(hash[n]) 51 | }) 52 | 53 | }) 54 | return hash["1"] 55 | }; 56 | let n1 = new Node("1") 57 | let n2 = new Node("2") 58 | let n3 = new Node("3") 59 | let n4 = new Node("4") 60 | 61 | n1.add(n2) 62 | n1.add(n4) 63 | 64 | n2.add(n1) 65 | n2.add(n3) 66 | 67 | n3.add(n2); 68 | n3.add(n4); 69 | 70 | n4.add(n1); 71 | n4.add(n3) 72 | 73 | const newGraph = cloneGraph(n1) 74 | console.log(newGraph) 75 | 76 | 77 | 78 | var cloneGraph1 = function (node){ 79 | // 更加简洁的递归处理 80 | let map = new Map(); 81 | const DFS = (node)=>{ 82 | if(!node || !node.val)return; 83 | // 创建一个新的 Node 84 | let cloneNode = new Node(node.val); 85 | map.set(node.val,cloneNode) 86 | for (let i = 0; i < node.neighbors.length; i++) { 87 | let neighborNode = node.neighbors[i] 88 | //如果 map 内有的话,那么直接添加到 neighbors 内 89 | if (map.has(neighborNode.val)) { 90 | cloneNode.neighbors.push(map.get(neighborNode.val)); 91 | } else { 92 | // 如果没有的话, 递归处理 =》 93 | cloneNode.neighbors.push(DFS(neighborNode)); 94 | } 95 | } 96 | return node; 97 | } 98 | DFS(node) 99 | return map.get("1") 100 | 101 | } 102 | cloneGraph1(n1) -------------------------------------------------------------------------------- /src/leetcode/dailyTemperatures.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 每日温度 3 | * 根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高的天数。如果之后都不会升高,请输入 0 来代替。 4 | * 5 | * 例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。 6 | * 7 | * 提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的都是 [30, 100] 范围内的整数。 8 | * 9 | * @param {number[]} T 10 | * @return {number[]} 11 | */ 12 | const Stack = require("../dataStructure/Stack"); 13 | var dailyTemperatures = function (T) { 14 | // 使用一个 while 解决 15 | // 但是逻辑较复杂 16 | if (T === 1) return 0; 17 | 18 | let s1 = new Stack(); 19 | let s2 = new Stack(); 20 | let r = []; 21 | 22 | 23 | let startIndex; 24 | let i = 0; 25 | while(i < T.length){ 26 | let val = T[i] 27 | if (s1.empty()) { 28 | s1.push(val) 29 | r.push(0) 30 | startIndex = i; 31 | i++; 32 | } else { 33 | if (val > s1.peek()) { 34 | const len = s2.getLength() + 1; 35 | s2.clear(); 36 | s1.clear(); 37 | r[r.length -1] = len; 38 | i = startIndex + 1; 39 | } else if(i < T.length - 1){ 40 | s2.push(val) 41 | i++; 42 | }else{ 43 | i = startIndex + 1 44 | s2.clear(); 45 | s1.clear(); 46 | } 47 | } 48 | 49 | } 50 | return r; 51 | }; 52 | 53 | 54 | 55 | var dailyTemperatures1 = function(T){ 56 | /** 57 | * O(n * n) 58 | */ 59 | let r = []; 60 | for(let i=0,len = T.length; i< len; i++){ 61 | r[i] = 0; 62 | let val = T[i] 63 | let j = i + 1; 64 | while(j < len){ 65 | if(T[j] > val){ 66 | let v = j - i; 67 | r[r.length - 1] = v; 68 | break; 69 | }else{ 70 | j++ 71 | } 72 | } 73 | } 74 | return r; 75 | } 76 | 77 | dailyTemperatures1([73, 74, 75, 71, 69, 72, 76, 73]) -------------------------------------------------------------------------------- /src/leetcode/decodeString.js: -------------------------------------------------------------------------------- 1 | /* 2 | * 字符串解码 3 | * 给定一个经过编码的字符串,返回它解码后的字符串。 4 | * 5 | * 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 6 | * 7 | * 你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。 8 | * 9 | * 此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。 10 | * 11 | * 示例: 12 | * 13 | * s = "3[a]2[bc]", 返回 "aaabcbc". 14 | * s = "3[a2[c]]", 返回 "accaccacc". 15 | * s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef". 16 | * 17 | * @param {string} s 18 | * @return {string} 19 | */ 20 | var decodeString = function(s) { 21 | // 非 ] 都入栈 22 | // ] 时候出栈,直到遇到 [ (这部分内容为乘子) 23 | // 继续出栈 (倍数) 24 | // 乘子 * 倍数 然后入栈 25 | 26 | let stack = []; 27 | for(let i=0,len = s.length; i{ 47 | r = r + s; 48 | return r; 49 | },"") 50 | }; 51 | // decodeString("3[a]2[bc]"); 52 | decodeString("3[a2[c]]"); 53 | // decodeString("2[abc]3[cd]ef"); 54 | decodeString("10[leet]"); -------------------------------------------------------------------------------- /src/leetcode/evalRPN.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 逆波兰表达式求值 3 | * 根据逆波兰表示法,求表达式的值。 4 | * 5 | * 有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。 6 | * 7 | * 说明: 8 | * 9 | * 整数除法只保留整数部分。 10 | * 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。 11 | * 12 | * 示例 1: 13 | * 14 | * 输入: ["2", "1", "+", "3", "*"] 15 | * 输出: 9 16 | * 解释: ((2 + 1) * 3) = 9 17 | * 18 | * 示例 2: 19 | * 20 | * 输入: ["4", "13", "5", "/", "+"] 21 | * 输出: 6 22 | * 解释: (4 + (13 / 5)) = 6 23 | * 24 | * 示例 3: 25 | * 26 | * 输入: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"] 27 | * 输出: 22 28 | * 解释: 29 | * ((10 * (6 / ((9 + 3) * -11))) + 17) + 5 30 | * = ((10 * (6 / (12 * -11))) + 17) + 5 31 | * = ((10 * (6 / -132)) + 17) + 5 32 | * = ((10 * 0) + 17) + 5 33 | * = (0 + 17) + 5 34 | * = 17 + 5 35 | * = 22 36 | * 37 | * 38 | * @param {string[]} tokens 39 | * @return {number} 40 | */ 41 | 42 | var evalRPN = function(tokens) { 43 | const stack = []; 44 | 45 | const add = function (a,b){ 46 | return a + b; 47 | } 48 | const subtract = function (a,b){ 49 | return a - b; 50 | } 51 | 52 | const multiply = function (a,b){ 53 | return a * b 54 | } 55 | 56 | const divide = function (a,b){ 57 | return a / b 58 | } 59 | 60 | let map = { 61 | "+": add, 62 | "-": subtract, 63 | "*": multiply, 64 | "/": divide 65 | } 66 | 67 | for(let i=0, len = tokens.length; i { 19 | if (n === 1 || n === 2) return 1; 20 | let a = hash[n - 1] || calcu(n - 1); 21 | let b = hash[n - 2] || calcu(n - 2); 22 | return a + b; 23 | } 24 | for (let i = 1; i <= n; i++) { 25 | hash[i] = calcu(i) 26 | } 27 | return hash[n] 28 | } 29 | console.log(faibonacci1(5)); -------------------------------------------------------------------------------- /src/leetcode/findPeakElement.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 寻找峰值 3 | * 峰值元素是指其值大于左右相邻值的元素。 4 | * 5 | * 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。 6 | * 7 | * 数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。 8 | * 9 | * 你可以假设 nums[-1] = nums[n] = -∞。 10 | * 11 | * 示例 1: 12 | * 13 | * 输入: nums = [1,2,3,1] 14 | * 输出: 2 15 | * 解释: 3 是峰值元素,你的函数应该返回其索引 2。 16 | * 示例 2: 17 | * 18 | * 输入: nums = [1,2,1,3,5,6,4] 19 | * 输出: 1 或 5 20 | * 解释: 你的函数可以返回索引 1,其峰值元素为 2; 21 | * 或者返回索引 5, 其峰值元素为 6。 22 | * 说明: 23 | * 24 | 你的解法应该是 O(logN) 时间复杂度的。 25 | * @param {number[]} nums 26 | * @return {number} 27 | */ 28 | var findPeakElement = function(nums) { 29 | // 峰值 = 当前节点 > 左侧节点 && 当前节点 > 右侧节点 30 | // 如果 当前节点 < 右侧节点 -》 说明 峰值在右侧 left = mid + 1; 31 | // 如果 当前节点 > 右侧节点 -》 说明 峰值在左侧 right = mid - 1; 32 | 33 | if(!nums)return -1; 34 | if(nums.length === 0)return -1; 35 | if(nums.length === 1)return 0; 36 | 37 | let l = 0; 38 | let r = nums.length -1; 39 | 40 | // 因为如果 mid 等于 r 的时候 41 | // 下面判断 mid + 1 的话 就无法进入了,造成了死循环 42 | // 所以 l 的值不能大于 r 43 | while(l < r){ 44 | let mid = l + ((r - l) >> 1); 45 | 46 | if(nums[mid] > nums[mid - 1] && nums[mid] > nums[mid + 1]){ 47 | return mid; 48 | }else if(nums[mid] < nums[mid + 1]){ 49 | l = mid + 1; 50 | }else if(nums[mid] > nums[mid + 1]){ 51 | r = mid - 1; 52 | } 53 | } 54 | return l; 55 | 56 | }; 57 | 58 | // const r = findPeakElement( [1,2,3,1]) 59 | // const r = findPeakElement( [2,1]) 60 | const r = findPeakElement( [1,2]) 61 | // const r = findPeakElement([1,2,1,3,5,6,4]) 62 | console.log(r); 63 | -------------------------------------------------------------------------------- /src/leetcode/floodFill.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 图像渲染 3 | * 有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间。 4 | * 5 | * 给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 newColor,让你重新上色这幅图像。 6 | * 7 | * 为了完成上色工作,从初始坐标开始,记录初始坐标的上下左右四个方向上像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应四个方向上像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为新的颜色值。 8 | * 9 | * 最后返回经过上色渲染后的图像。 10 | * 11 | * 示例 1: 12 | * 13 | * 输入: 14 | * image = [[1,1,1],[1,1,0],[1,0,1]] 15 | * sr = 1, sc = 1, newColor = 2 16 | * 输出: [[2,2,2],[2,2,0],[2,0,1]] 17 | * 解析: 18 | * 在图像的正中间,(坐标(sr,sc)=(1,1)), 19 | * 在路径上所有符合条件的像素点的颜色都被更改成2。 20 | * 注意,右下角的像素没有更改为2, 21 | * 因为它不是在上下左右四个方向上与初始点相连的像素点。 22 | * 注意: 23 | * 24 | * image 和 image[0] 的长度在范围 [1, 50] 内。 25 | * 给出的初始点将满足 0 <= sr < image.length 和 0 <= sc < image[0].length。 26 | * image[i][j] 和 newColor 表示的颜色值在范围 [0, 65535]内。 27 | * @param {number[][]} image 28 | * @param {number} sr 29 | * @param {number} sc 30 | * @param {number} newColor 31 | * @return {number[][]} 32 | */ 33 | var floodFill = function (image, sr, sc, newColor) { 34 | if(!image || image.length === 0 || image[0].length === 0)return; 35 | if(image[sr] === null)return; 36 | if(image[sr][sc] === null)return; 37 | 38 | let row = image.length; 39 | let col = image[0].length; 40 | let queue = []; 41 | let target = image[sr][sc] 42 | 43 | 44 | let visited = []; 45 | for(let i=0; i{ 55 | // 获取周边坐标点 56 | 57 | let points = []; 58 | // 左 59 | if(x - 1 >= 0 ){ 60 | points.push({ x: x - 1, y }); 61 | } 62 | // 右 63 | if( x + 1 <= row - 1 ) 64 | { 65 | points.push({ x: x + 1, y }); 66 | } 67 | 68 | // 上 69 | if( y - 1 >= 0 ){ 70 | points.push({ x, y: y - 1 }); 71 | } 72 | // 下 73 | if( y + 1 <= col - 1 ){ 74 | points.push({ x, y: y + 1 }); 75 | } 76 | return points; 77 | } 78 | 79 | queue.push({x:sr,y:sc}); 80 | 81 | while(queue.length !== 0){ 82 | const curPoint = queue.shift(); 83 | const points = getPoints(curPoint); 84 | points.push(curPoint) 85 | 86 | for(let i=0,len = points.length; i{ 7 | let len = node.children.length; 8 | for(let i=0; i 0){ 11 | iteration(childrenNode,r) 12 | }else{ 13 | r.push(childrenNode) 14 | } 15 | } 16 | } 17 | for(let i=0,len=nodes.length;i { 52 | if (!node) return; 53 | 54 | console.log(node.val); 55 | f(node.left); 56 | f(node.right); 57 | } 58 | f(root) 59 | }; 60 | inorderTraversal(root) 61 | 62 | 63 | /** 64 | * 非递归的前序 65 | * @param {} root 66 | */ 67 | var preOrder1 = function (root) { 68 | 69 | let stack = []; 70 | 71 | 72 | while (root) { 73 | if (!root.isVisited) { 74 | stack.push(root) 75 | if (!root.isLog) { 76 | console.log(root.val) 77 | root.isLog = true; 78 | } 79 | } 80 | 81 | if (root.left && !root.isLeft) { 82 | root.isLeft = true; 83 | root = root.left; 84 | } else if (root.right && !root.isRight) { 85 | root.isRight = true; 86 | root = root.right; 87 | } else { 88 | root.isVisited = true; 89 | stack.pop(); 90 | root = stack[stack.length - 1] 91 | } 92 | } 93 | } 94 | 95 | var preOrder2 = function (root) { 96 | const s = []; 97 | let p = root; 98 | while (p != null || s.length !== 0) { 99 | while (p != null) { 100 | console.log(p.val) 101 | s.push(p); 102 | p = p.left; 103 | } 104 | // 左侧节点已经走完 这时候需要出栈,并且指向父节点的右子树 105 | if (s.length !== 0) { 106 | p = s.pop(); 107 | p = p.right; 108 | } 109 | } 110 | } 111 | 112 | preOrder2(root); 113 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /src/leetcode/isValid.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 有效的括号 3 | * 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。 4 | * 5 | * 有效字符串需满足: 6 | * 7 | * 左括号必须用相同类型的右括号闭合。 8 | * 左括号必须以正确的顺序闭合。 9 | * 10 | * 注意空字符串可被认为是有效字符串。 11 | * 12 | * 示例 1: 13 | * 14 | * 输入: "()" 15 | * 输出: true 16 | * 17 | * 示例 2: 18 | * 19 | * 输入: "()[]{}" 20 | * 输出: true 21 | * 22 | * 示例 3: 23 | * 24 | * 输入: "(]" 25 | * 输出: false 26 | * 27 | * 示例 4: 28 | * 29 | * 输入: "([)]" 30 | * 输出: false 31 | * 32 | * 示例 5: 33 | * 34 | * 输入: "{[]}" 35 | * 输出: true 36 | * 37 | * 38 | * @param {string} s 39 | * @return {boolean} 40 | */ 41 | 42 | const Stack = require(`../dataStructure/Stack.js`); 43 | 44 | var isValid = function(s) { 45 | if(!s) return true; 46 | let sList = s.split(""); 47 | let len = sList.length; 48 | let stack = new Stack(); 49 | let hash = { 50 | "{":"}", 51 | "}":"{", 52 | "(":")", 53 | ")":"(", 54 | "[":"]", 55 | "]":"[" 56 | } 57 | for(let i=0; i> 1 是为了防止 l + r 溢出 33 | let mid = left +((right - left) >> 1 ); 34 | // 终止条件 35 | // 1. mid * mid === x 36 | // 2. x 在 mid * mid 和 (mid + 1) * (mid + 1) 的范围内 37 | if(mid * mid === x || (x > (mid * mid) && x < (mid + 1) * (mid + 1))){ 38 | return mid; 39 | }else if(mid * mid > x){ 40 | right = mid - 1; 41 | }else{ 42 | left = mid + 1; 43 | } 44 | } 45 | }; 46 | 47 | var mySqrt1 = function(x){ 48 | if(x === 0)return 0; 49 | 50 | // 简单for循环版实现 51 | for(let i=1; i<=x; i++){ 52 | if(i * i > x){ 53 | return i - 1; 54 | }else if(i * i === x){ 55 | return i; 56 | } 57 | } 58 | return 0; 59 | } 60 | 61 | [2147483647 62 | ].forEach( (i)=>console.log(mySqrt(i))) 63 | // const r = mySqrt(4) 64 | // const r = mySqrt(8) 65 | // const r = mySqrt(9) 66 | // const r = mySqrt(1024) 67 | // console.log(r); -------------------------------------------------------------------------------- /src/leetcode/numIslands.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 岛屿的个数 3 | * 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。 4 | * 5 | * 示例 1: 6 | * 7 | * 输入: 8 | * 11110 9 | * 11010 10 | * 11000 11 | * 00000 12 | * 13 | * 输出: 1 14 | * 15 | * 示例 2: 16 | * 17 | * 输入: 18 | * 11000 19 | * 11000 20 | * 00100 21 | * 00011 22 | * 23 | * 输出: 3 24 | * @param {character[][]} grid 25 | * @return {number} 26 | */ 27 | let grid = [[1,1,1,1,0], 28 | [1,1,0,1,0], 29 | [1,1,0,0,0], 30 | [0,0,0,0,0]] 31 | 32 | let grid1 = [[1,1,0,0,0], 33 | [1,1,0,0,0], 34 | [0,0,1,0,0], 35 | [0,0,0,1,1]] 36 | 37 | let grid2 = [["1","1","1","1","0"],["1","1","0","1","0"],["1","1","0","0","0"],["0","0","0","0","0"]] 38 | 39 | let grid3 = [["1","0","1","1","0","1","1"]] 40 | var numIslands = function(grid) { 41 | if(!grid && grid.length === 0)return 0; 42 | if(!grid[0])return 0; 43 | //1. 遇到 1 就把它附近所有的1全部感染 44 | //2. 遇到几次1 就说明有几个岛屿 45 | 46 | var infection = function (gird,j,i,row,low){ 47 | if(i < 0 || i >= row)return; 48 | if(j < 0 || j >= low)return; 49 | gird[j][i] = Number.parseInt(gird[j][i]); 50 | if(gird[j][i] === 0)return; 51 | gird[j][i] = 0; 52 | 53 | infection(gird,j,i + 1,row,low); 54 | infection(gird,j,i - 1,row,low); 55 | infection(gird,j + 1,i,row,low); 56 | infection(gird,j - 1,i,row,low); 57 | } 58 | 59 | const row = grid[0].length; 60 | const col = grid.length; 61 | let count = 0; 62 | for(let i=0; i "1000" -> "1100" -> "1200" -> "1201" -> "1202" -> "0202"。 18 | * 注意 "0000" -> "0001" -> "0002" -> "0102" -> "0202" 这样的序列是不能解锁的, 19 | * 因为当拨动到 "0102" 时这个锁就会被锁定。 20 | * 21 | * 示例 2: 22 | * 23 | * 输入: deadends = ["8888"], target = "0009" 24 | * 输出:1 25 | * 解释: 26 | * 把最后一位反向旋转一次即可 "0000" -> "0009"。 27 | * 28 | * 示例 3: 29 | * 30 | * 输入: deadends = ["8887","8889","8878","8898","8788","8988","7888","9888"], target = "8888" 31 | * 输出:-1 32 | * 解释: 33 | * 无法旋转到目标数字且不被锁定。 34 | * 35 | * 示例 4: 36 | * 37 | * 输入: deadends = ["0000"], target = "8888" 38 | * 输出:-1 39 | * 40 | * 41 | * 42 | * 提示: 43 | * 44 | * 死亡列表 deadends 的长度范围为 [1, 500]。 45 | * 目标数字 target 不会在 deadends 之中。 46 | * 每个 deadends 和 target 中的字符串的数字会在 10,000 个可能的情况 '0000' 到 '9999' 中产生。 47 | * 48 | * @param {string[]} deadends 49 | * @param {string} target 50 | * @return {number} 51 | * */ 52 | const Queue = require('../dataStructure/Queue'); 53 | // var deadends = ["0201", "0101", "0102", "1212", "2002"] 54 | // var target = "0202" 55 | 56 | 57 | const getNeighbor = function (node) { 58 | // 0000 - 9999 59 | let strList = node.split(""); 60 | let neighbor = new Set(); 61 | for (let i = 0, len = strList.length; i < len; i++) { 62 | //8个邻居 63 | let tempList = strList.slice(); 64 | const upS = (+strList[i]) === 0 ? 9 : strList[i] - 1; 65 | tempList[i] = upS + ""; 66 | neighbor.add(tempList.join("")); 67 | 68 | tempList = strList.slice(); 69 | const downS = (+tempList[i] + 1) % 10; 70 | tempList[i] = downS + ""; 71 | neighbor.add(tempList.join("")); 72 | } 73 | return Array.from(neighbor); 74 | } 75 | 76 | var openLock = function (deadends, target) { 77 | //bfs 搜索,检测一个最短距离 78 | //除了死亡列表内的元素和访问过的元素 别的元素都需要放到队列内,搜索检测 79 | var visited = Object.create(null); 80 | //把死亡列表转换为hash,查找更快 81 | var deadHash = Object.create(null); 82 | deadends.forEach(element => { 83 | deadHash[element] = true; 84 | }); 85 | var start = "0000"; 86 | var queue = new Queue(); 87 | queue.enqueue(start); 88 | visited[start] = true; 89 | 90 | 91 | 92 | let step = 0; 93 | while (!queue.isEmpty()) { 94 | let size = queue.size(); 95 | //广度优先遍历, 每次添加的元素算作一轮 a -> b,c,d,e 遍历完 b c d e 后 这才叫做一轮 96 | for (let i = 0; i < size; i++) { 97 | 98 | let node = queue.dequeue(); 99 | console.log(node) 100 | if (node === target) { 101 | return step; 102 | } 103 | //获取周围的节点 104 | let neighborList = getNeighbor(node); 105 | for (let i = 0, len = neighborList.length; i < len; i++) { 106 | let neighborNode = neighborList[i]; 107 | 108 | if (!deadHash[neighborNode] && !visited[neighborNode]) { 109 | visited[neighborNode] = true; 110 | queue.enqueue(neighborNode); 111 | } 112 | } 113 | } 114 | step++; 115 | } 116 | return "-1"; 117 | }; 118 | // var r = openLock(["8887","8889","8878","8898","8788","8988","7888","9888"], "8888"); 119 | 120 | 121 | 122 | //双向广度优先搜索 123 | var openLock2 = function (deadends,target){ 124 | const dead = new Set(deadends); 125 | const visited = new Set(); 126 | const init = '0000' 127 | if (dead.has(init) || dead.has(target)) { 128 | return -1; 129 | } 130 | 131 | if(target === init)return 0; 132 | 133 | let set1 = new Set(); 134 | set1.add(init); 135 | 136 | let set2 = new Set(); 137 | set2.add(target) 138 | 139 | let steps = 0; 140 | while (set1.size && set2.size) { 141 | if (set1.size > set2.size) { 142 | var temp = set1; 143 | set1 = set2; 144 | set2 = temp; 145 | } 146 | let set3 = new Set() 147 | for(let cur of set1){ 148 | const nexts = getNeighbor(cur); 149 | for(let next of nexts){ 150 | if(set2.has(next)){ 151 | return steps + 1; 152 | } 153 | if(!dead.has(next) && !visited.has(next)) 154 | { 155 | visited.add(next) 156 | set3.add(next) 157 | } 158 | } 159 | 160 | } 161 | 162 | steps++; 163 | set1 = set3; 164 | } 165 | 166 | return -1; 167 | } 168 | openLock2(["0201", "0101", "0102", "1212", "2002"],"0202") 169 | console.log(r); 170 | -------------------------------------------------------------------------------- /src/leetcode/sameTree.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 对比两棵二叉树是否一致 3 | */ 4 | 5 | let t1 = { 6 | val:1, 7 | leftNode:{ 8 | val: 2, 9 | leftNode:{ 10 | val: 4, 11 | leftNode:null, 12 | rightNode: null 13 | }, 14 | rightNode:{ 15 | val: 5, 16 | leftNode:null, 17 | rightNode: null 18 | } 19 | }, 20 | rightNode:{ 21 | val:3, 22 | leftNode:{ 23 | val: 6, 24 | leftNode:null, 25 | rightNode: null 26 | }, 27 | rightNode:{ 28 | val: 7, 29 | leftNode:null, 30 | rightNode: null 31 | } 32 | } 33 | } 34 | let t2 = { 35 | val:1, 36 | leftNode:{ 37 | val: 2, 38 | leftNode:{ 39 | val: 4, 40 | leftNode:null, 41 | rightNode: null 42 | }, 43 | rightNode:{ 44 | val: 5, 45 | leftNode:null, 46 | rightNode: null 47 | } 48 | }, 49 | rightNode:{ 50 | val:3, 51 | leftNode:{ 52 | val: 6, 53 | leftNode:null, 54 | rightNode: null 55 | }, 56 | rightNode:{ 57 | val: 7, 58 | leftNode:null, 59 | rightNode: null 60 | } 61 | } 62 | } 63 | 64 | var sameTree = function (t1,t2){ 65 | //如果到树底得话,那么返回 true 66 | if(!t1 && !t2){ 67 | return true; 68 | } 69 | 70 | //对比 左右节点结构 71 | if((t1 && !t2) || (!t1 && t2)){ 72 | return false; 73 | } 74 | 75 | //对比 值 76 | if(t1.val !== t2.val){ 77 | return false; 78 | } 79 | 80 | //左右两棵树都为 true 才为 true 81 | return sameTree(t1.leftNode, t2.leftNode) && sameTree(t1.rightNode, t2.rightNode) 82 | 83 | } 84 | 85 | 86 | var sameTree1 = function (t1,t2){ 87 | 88 | //1. 先遍历完2颗树 89 | const traverse = (tree)=>{ 90 | const r = []; 91 | const iteration = (node)=>{ 92 | if(!node)return; 93 | r.push(node.val); 94 | iteration(node.leftNode); 95 | iteration(node.rightNode); 96 | } 97 | iteration(tree); 98 | return r; 99 | } 100 | let t1List = traverse(t1); 101 | let t2List = traverse(t2); 102 | //2.然后对比数组 103 | if(t1List.length != t2List.length){ 104 | return false; 105 | } 106 | 107 | for(let i=0, len = t1List.length; i> 1; 38 | if(nums[mid] === target){ 39 | return mid; 40 | }else if(nums[mid] < target){ 41 | // 说明target 在数组的右侧 42 | left = mid+1; 43 | }else{ 44 | right = mid - 1; 45 | } 46 | } 47 | return -1; 48 | }; 49 | 50 | var serach1 = function(nums,target){ 51 | //递归版本 52 | const f = (left,right)=>{ 53 | // 终止条件 54 | if(left > right)return -1; 55 | let mid = (left + right) >> 1; 56 | // 命中需要终止 57 | if(nums[mid] === target){ 58 | return mid; 59 | }else if(nums[mid] < target){ 60 | // 说明target 在数组的右侧 61 | left = mid+1; 62 | }else{ 63 | right = mid - 1; 64 | } 65 | return f(left,right) 66 | } 67 | return f(0,nums.length - 1); 68 | } 69 | // console.log(serach1([-1,0,3,5,9,12],9)); 70 | console.log(serach1([-1,0,3,5,9,12],2)); 71 | // console.log(search([-1,0,3,5,9,12],2)); -------------------------------------------------------------------------------- /src/leetcode/searchMatrix.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 搜索二维矩阵 II 3 | * 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性: 4 | * 5 | * 每行的元素从左到右升序排列。 6 | * 每列的元素从上到下升序排列。 7 | * 示例: 8 | * 9 | * 现有矩阵 matrix 如下: 10 | * 11 | * [ 12 | * [1, 4, 7, 11, 15], 13 | * [2, 5, 8, 12, 19], 14 | * [3, 6, 9, 16, 22], 15 | * [10, 13, 14, 17, 24], 16 | * [18, 21, 23, 26, 30] 17 | * ] 18 | * 给定 target = 5,返回 true。 19 | * 20 | * 给定 target = 20,返回 false。 21 | * @param {number[][]} matrix 22 | * @param {number} target 23 | * @return {boolean} 24 | */ 25 | var searchMatrix = function(matrix, target) { 26 | //先确定小得范围 27 | //如果target得值 大于 matrix[i][0] 小于 matrix[i][matrix[i].length] 说明其值有可能在这个范围内, 28 | //因为当前范围内得值都是有序得,可使用二分查找搜索 29 | //优化点:可以把for循环改为二分查找确定行 30 | for(let i=0,len = matrix.length; i list[0] && target < list[listLen]){ 36 | //使用二分查找 37 | let l = 0; 38 | let r = listLen; 39 | while(l <= r){ 40 | let m = (r+l) >> 1; 41 | if (list[m] === target) { 42 | return true; 43 | } else if (list[m] < target) { 44 | //说明在右侧 45 | l = m + 1; 46 | } else { 47 | //说明在左侧 48 | r = m - 1; 49 | } 50 | } 51 | } 52 | } 53 | return false; 54 | }; 55 | 56 | 57 | let m = [ 58 | [1, 4, 7, 11, 15], 59 | [2, 5, 8, 12, 19], 60 | [3, 6, 9, 16, 22], 61 | [10, 13, 14, 17, 24], 62 | [18, 21, 23, 26, 30] 63 | ] 64 | console.log(searchMatrix(m,20)); 65 | 66 | 67 | 68 | var searchMatrix1 = function(matrix, target) { 69 | //更快得解法 70 | // 1. 所锁定行 71 | let len = matrix.length; 72 | let i = 0; 73 | let j = matrix[0].length - 1; 74 | 75 | 76 | while(i < len && j >= 0){ 77 | if(matrix[i][j] === target)return true; 78 | else{ 79 | if(matrix[i][j] > target){ 80 | j--; 81 | }else{ 82 | i++; 83 | } 84 | } 85 | } 86 | return false; 87 | } 88 | 89 | // console.log(searchMatrix1(m,20)); 90 | let mm = [[-5]] 91 | // searchMatrix1(mm,-5) 92 | -------------------------------------------------------------------------------- /src/leetcode/singleNumber.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 3 | * 4 | * 说明: 5 | * 6 | * 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 7 | * 8 | * 示例 1: 9 | * 10 | * 输入: [2,2,1] 11 | * 输出: 1 12 | * 示例 2: 13 | * 14 | * 输入: [4,1,2,1,2] 15 | * 输出: 4 16 | * @param {number[]} nums 17 | * @return {number} 18 | * */ 19 | var singleNumber = function(nums) { 20 | if(nums.length === 0)return -1; 21 | let set = new Set(); 22 | for(let val of nums){ 23 | if(set.has(val)){ 24 | set.delete(val); 25 | }else{ 26 | set.add(val) 27 | } 28 | } 29 | const min = Array.from(set) 30 | return min[0] 31 | }; 32 | console.log(singleNumber([2,2,1])) -------------------------------------------------------------------------------- /src/leetcode/updateMatrix.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 01 矩阵 3 | * 给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。 4 | * 5 | * 两个相邻元素间的距离为 1 。 6 | * 7 | * 示例 1: 8 | * 输入: 9 | * 10 | * 0 0 0 11 | * 0 1 0 12 | * 0 0 0 13 | * 输出: 14 | * 15 | * 0 0 0 16 | * 0 1 0 17 | * 0 0 0 18 | * 示例 2: 19 | * 输入: 20 | * 21 | * 0 0 0 22 | * 0 1 0 23 | * 1 1 1 24 | * 输出: 25 | * 26 | * 0 0 0 27 | * 0 1 0 28 | * 1 2 1 29 | * 注意: 30 | * 31 | * 给定矩阵的元素个数不超过 10000。 32 | * 给定矩阵中至少有一个元素是 0。 33 | * 矩阵中的元素只在四个方向上相邻: 上、下、左、右。 34 | * @param {number[][]} matrix 35 | * @return {number[][]} 36 | */ 37 | var updateMatrix = function(matrix) { 38 | // BFS解题 39 | // 待优化, leetcode 超时 40 | 41 | let row = matrix.length; 42 | let col = matrix[0].length; 43 | const getPoints = ({x,y})=>{ 44 | 45 | const points = []; 46 | if(x - 1 >= 0){ 47 | points.push({x:x-1,y}); 48 | } 49 | 50 | if(x + 1 < row){ 51 | points.push({x:x+1,y}) 52 | } 53 | 54 | if( y - 1 >= 0){ 55 | points.push({x,y: y - 1}); 56 | } 57 | 58 | if( y + 1 < col){ 59 | points.push({x,y: y + 1}); 60 | } 61 | 62 | return points; 63 | } 64 | 65 | const hasZero = function(list){ 66 | return list.some(({x,y})=>{ 67 | return matrix[x][y] === 0; 68 | }) 69 | } 70 | 71 | 72 | const initVisited = function(){ 73 | let visited = [] 74 | for(let i=0; i 0) { 111 | queue.push(nextList); 112 | } 113 | } 114 | } 115 | } 116 | } 117 | console.log(matrix) 118 | return matrix; 119 | }; 120 | // updateMatrix([[0,0,0],[0,1,0],[1,1,1]]); 121 | // updateMatrix([[0,0,0],[0,1,0],[0,0,0]]); 122 | updateMatrix([[1, 0, 1, 1, 0, 0, 1, 0, 0, 1], 123 | [0, 1, 1, 0, 1, 0, 1, 0, 1, 1], 124 | [0, 0, 1, 0, 1, 0, 0, 1, 0, 0], 125 | [1, 0, 1, 0, 1, 1, 1, 1, 1, 1], 126 | [0, 1, 0, 1, 1, 0, 0, 0, 0, 1], 127 | [0, 0, 1, 0, 1, 1, 1, 0, 1, 0], 128 | [0, 1, 0, 1, 0, 1, 0, 0, 1, 1], 129 | [1, 0, 0, 0, 1, 1, 1, 1, 0, 1], 130 | [1, 1, 1, 1, 1, 1, 1, 0, 1, 0], 131 | [1, 1, 1, 1, 0, 1, 0, 0, 1, 1] 132 | ]); -------------------------------------------------------------------------------- /src/sort/bubbleSort.js: -------------------------------------------------------------------------------- 1 | let utils = require('../utils/index.js'); 2 | /** 3 | * 冒泡排序 4 | */ 5 | function bubbleSort(list){ 6 | let len = list.length; 7 | for(let i=0; i list[i]){ 10 | utils.exchange(list,j,i); 11 | } 12 | } 13 | } 14 | } 15 | 16 | module.exports = bubbleSort; 17 | -------------------------------------------------------------------------------- /src/sort/index.js: -------------------------------------------------------------------------------- 1 | let selectSort = require('./selectSort.js'); 2 | let bubbleSort = require('./bubbleSort.js'); 3 | let insertSort = require('./insertSort.js'); 4 | 5 | 6 | module.exports = { 7 | selectSort, 8 | bubbleSort, 9 | insertSort 10 | } -------------------------------------------------------------------------------- /src/sort/insertSort.js: -------------------------------------------------------------------------------- 1 | let utils = require('../utils/index.js'); 2 | /** 3 | * 插入排序 4 | * 从右到左 计算量越来越小 5 | */ 6 | function insertSort(list){ 7 | let len = list.length; 8 | let num; 9 | let index; 10 | for(let i=1; i=0; j--){ 14 | if( list[j] > num ){ //list【j】 数据左侧的值 如果左侧的值大于当前的值 右移 否则插入 -进入下一轮循环 15 | list[j+1] = list[j]; 16 | index++; 17 | }else{ 18 | list.splice(i-index,1,num); 19 | break; 20 | } 21 | } 22 | } 23 | } 24 | module.exports = insertSort -------------------------------------------------------------------------------- /src/sort/quickSort.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 快速排序 3 | * 复杂度:O(log n * n) 4 | * 思想:分而治之 利用 D&C 思想 5 | * 6 | * 分析: 7 | * 组成递归的条件: 8 | * 基准条件:数组的长度小于2 (小于2的时候 没有交换的必要) 9 | * 循环条件: 10 | * 1.例如数组为[4,1,8] 11 | * 取一个分水值 12 | * 例如取 数组的第一个值 4. 13 | * 然后 把其余的 数据 分开 大于 4的 在右边 小于 4的 在左边;例如: 14 | * 1 比 4小 放左边:1 [4], 8比 4 大 放右边: 4 [8]; 15 | * 联合起来 就是 1 4 8 16 | * 17 | * 利用递归 来把一个大的数组 拆分成小的 分别按照以上步骤处理 这就是D&C 思想 18 | * 拆分步骤: 19 | * 分解:[6,2,5,34,7,3,58,9] 20 | * 1. 取6: 2 5 3 【6】7 9 34 58 21 | * 2. [2 5 3] 取2:【2】 5 3 22 | * 3. [5,3] 取5: 3 【5】 23 | * 4. 数组长度小于 2 结束 24 | * 25 | * 5. [7 9 34 58] 取7:【7】9 34 58 26 | * 6. [9 34 58] 取9:【9】34 58 27 | * 7. [34 58] 取34 【34】58 28 | * 8. 数组长度小于 2结束 29 | * 30 | */ 31 | 32 | //一不小心写了一个去重排序 33 | function quickSort1(list){ 34 | if(list.length < 2)return list; 35 | let q = list[0]; 36 | let leftList = list.filter( v => v < q); 37 | let rightList = list.filter( v=> v > q); 38 | return [...quickSort1(leftList),q,...quickSort1(rightList)]; 39 | } 40 | 41 | //快速排序 42 | function quickSort(list){ 43 | if(list.length < 2)return list; 44 | let q = list.shift(); 45 | let leftList = list.filter( v => v <= q); 46 | let rightList = list.filter( v=> v > q); 47 | return [...quickSort(leftList),q,...quickSort(rightList)]; 48 | } 49 | -------------------------------------------------------------------------------- /src/sort/selectSort.js: -------------------------------------------------------------------------------- 1 | let utils = require('../utils/index.js'); 2 | /** 3 | * 选择排序 4 | * 标记出最小的值 然后交换位置(位置基于i的值 变动) 5 | * 从左到右 6 | */ 7 | function selectSort(list){ 8 | let min; 9 | let tempIndex; 10 | let len = list.length; 11 | for(let i=0; i{ 27 | var link = new DoublyLink(); 28 | link.addAtHead(1); 29 | link.addAtTail(2); 30 | assert(link.length === 2); 31 | assert(link.head.value === 1); 32 | assert(link.head.next.value === 2); 33 | assert(link.head.next.prev.value === 1); 34 | 35 | }) 36 | 37 | }); 38 | 39 | describe('#addAtIndex()', function() { 40 | it('index等于链表的长度时,则该节点将附加到链表的末尾', function() { 41 | var link = new DoublyLink(); 42 | link.addAtHead(1); 43 | link.addAtIndex(1,2); 44 | var firstNode = link.head; 45 | var secondNode = link.head.next; 46 | assert(firstNode.value === 1); 47 | assert(secondNode.value === 2); 48 | assert(secondNode.prev.value === 1); 49 | 50 | }); 51 | 52 | it('如果 index 大于链表长度,则不会插入节点', function() { 53 | var link = new DoublyLink(); 54 | link.addAtIndex(0,1); 55 | link.addAtIndex(2,3); 56 | assert(link.head.value === 1); 57 | }); 58 | 59 | it('在链表中的第 index 个节点之前添加值为 val 的节点', function() { 60 | var link = new DoublyLink(); 61 | link.addAtIndex(0,1); 62 | link.addAtIndex(1,3); 63 | link.addAtIndex(1,2) 64 | 65 | assert(link.head.value === 1); 66 | assert(link.head.next.value === 2); 67 | assert(link.head.next.next.value === 3); 68 | assert(link.head.next.next.prev.value === 2); 69 | assert(link.head.next.prev.value == 1); 70 | }); 71 | 72 | }); 73 | 74 | describe("#deleteAtIndex()",()=>{ 75 | it("索引 index 无效,什么也不做",()=>{ 76 | var link = new DoublyLink(); 77 | link.addAtIndex(0,1); 78 | link.addAtIndex(1,2); 79 | 80 | link.deleteAtIndex(2); 81 | assert(link.head.next.value === 2); 82 | }) 83 | 84 | it(`有效的话,删除对应的索引的节点`,()=>{ 85 | var link = new DoublyLink(); 86 | link.addAtIndex(0,1); 87 | link.addAtIndex(1,2); 88 | 89 | link.deleteAtIndex(0); 90 | assert(link.head.value === 2); 91 | 92 | }) 93 | }) 94 | 95 | describe("#get()",()=>{ 96 | it(`如果index合法`,()=>{ 97 | var link = new DoublyLink(); 98 | link.addAtIndex(0,1); 99 | 100 | assert(link.get(0) === 1); 101 | }) 102 | 103 | it(`如果index 非法`,()=>{ 104 | var link = new DoublyLink(); 105 | assert(link.get(0) === -1); 106 | }) 107 | 108 | }) 109 | }); -------------------------------------------------------------------------------- /test/mergeTwoLists_test.js: -------------------------------------------------------------------------------- 1 | var assert = require('assert'); 2 | var {ListNode,mergeTwoLists} = require('../src/dataStructure/link/mergeTwoLists'); 3 | 4 | describe("#mergeTwoLists()",()=>{ 5 | it(`l1 = 1; l2 = 2; 应该输出 1 2`,()=>{ 6 | var l1 = new ListNode(1); 7 | 8 | var l2 = new ListNode(2); 9 | 10 | var a = mergeTwoLists(l1,l2); 11 | assert(a.val === 1); 12 | assert(a.next.val === 2); 13 | }) 14 | 15 | it(`l1 = 1,2,4; l2 = 1,3,4; 应该输出 1 1 2 3 4 4`,()=>{ 16 | var l1 = new ListNode(1); 17 | l1.next = new ListNode(2); 18 | l1.next.next = new ListNode(4); 19 | 20 | var l2 = new ListNode(1); 21 | l2.next = new ListNode(3); 22 | l2.next.next = new ListNode(4); 23 | 24 | 25 | var l3 = mergeTwoLists(l1,l2); 26 | assert(l3.val === 1); 27 | assert(l3.next.val === 1); 28 | assert(l3.next.next.val === 2); 29 | assert(l3.next.next.next.val === 3); 30 | assert(l3.next.next.next.next.val === 4); 31 | assert(l3.next.next.next.next.next.val === 4); 32 | }) 33 | }) 34 | -------------------------------------------------------------------------------- /test/stack_test.js: -------------------------------------------------------------------------------- 1 | var assert = require('assert'); 2 | var Stack = require('../src/dataStructure/Stack'); 3 | describe('Stack', function() { 4 | describe('#push()', function() { 5 | it('入栈后一个元素后,Stack 的长度应该为一', function() { 6 | var stack = new Stack(); 7 | stack.push(1); 8 | assert(stack.getLength() === 1); 9 | }); 10 | 11 | 12 | 13 | }); 14 | 15 | describe("#pop()",function(){ 16 | it("出栈一个元素后, Stack 的长度应该为零",function(){ 17 | var stack = new Stack(); 18 | stack.push(1); 19 | stack.pop(); 20 | assert(stack.getLength() === 0); 21 | }) 22 | 23 | it("出栈元素等于之前添加的",function(){ 24 | var stack = new Stack(); 25 | var value = 1; 26 | stack.push(value); 27 | var popValue = stack.pop(); 28 | assert(popValue === value ); 29 | }) 30 | 31 | it("当为空栈时,返回undefined",function(){ 32 | var stack = new Stack(); 33 | var popValue = stack.pop(); 34 | assert(popValue === undefined ); 35 | }) 36 | 37 | it("进栈 A ,出栈,进栈B,出栈,返回B",()=>{ 38 | var stack = new Stack(); 39 | stack.push("A"); 40 | stack.pop(); 41 | stack.push("B"); 42 | var result = stack.pop(); 43 | assert(result === "B"); 44 | }) 45 | }) 46 | 47 | 48 | describe("#peek()",function(){ 49 | it("栈顶为1时,返回1",function(){ 50 | var stack = new Stack(); 51 | 52 | stack.push(1); 53 | assert(stack.peek() === 1); 54 | }) 55 | 56 | it("栈为空时,返回undefined",function(){ 57 | var stack = new Stack(); 58 | assert(stack.peek() === undefined); 59 | }) 60 | }) 61 | 62 | describe("#empty()",function(){ 63 | it("栈的长度为0时,返回true",()=>{ 64 | var stack = new Stack(); 65 | var length = stack.getLength(); 66 | if(length === 0){ 67 | assert(stack.empty() === true) 68 | } 69 | }) 70 | }) 71 | }); --------------------------------------------------------------------------------