blog/db.json
Ching 9690121403 feat(init project): add all existing files
add all existing files

Signed-off-by: Ching <loooching@gmail.com>
2022-02-02 19:04:18 +08:00

1 line
490 KiB
JSON
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"meta":{"version":1,"warehouse":"2.2.0"},"models":{"Asset":[{"_id":"source/CNAME","path":"CNAME","modified":0,"renderable":0},{"_id":"themes/apollo/source/favicon.png","path":"favicon.png","modified":0,"renderable":1},{"_id":"themes/apollo/source/logo.png","path":"logo.png","modified":0,"renderable":1},{"_id":"themes/apollo/source/scss/apollo.scss","path":"scss/apollo.scss","modified":0,"renderable":1},{"_id":"themes/apollo/source/css/apollo.css","path":"css/apollo.css","modified":0,"renderable":1}],"Cache":[{"_id":"source/CNAME","hash":"c53a99d8555292c2cc8dd02c564b9d5fdfed89cb","modified":1526396315000},{"_id":"themes/apollo/.DS_Store","hash":"695101ad11d1cb210f2667e7bdcdccd7e40391de","modified":1586364749000},{"_id":"themes/apollo/.gitignore","hash":"a006beea0877a0aa3610ee00e73f62cb1d45125b","modified":1526396315000},{"_id":"themes/apollo/README.md","hash":"a6930c691c69ed78584022fbcd0f4245587d09f5","modified":1526396315000},{"_id":"themes/apollo/LICENSE","hash":"6e31ac9076bfc8f09ae47977419eee4edfb63e5b","modified":1526396315000},{"_id":"themes/apollo/_config.yml","hash":"0564002d6a750856deec82fb89f6b2cb41d0a294","modified":1587446398000},{"_id":"themes/apollo/gulpfile.js","hash":"857a026b6643a2cd52c65d4ae0dc7fe9618206ee","modified":1526396315000},{"_id":"themes/apollo/package.json","hash":"9426138c09ebb95969021d951590c0c54b187a43","modified":1526396315000},{"_id":"source/.MWebMetaData/setting.json","hash":"63037ec4e43ae67cbe98b4f81451eef32dccf232","modified":1573529113000},{"_id":"source/_posts/2020-03-17-leetcode-121.md","hash":"62aa9ec2e2aa784728c189d4d7145ebab1380ae3","modified":1584442443000},{"_id":"source/_posts/2018-05-31-bash-function-and-awk.md","hash":"e9e89d931fd9652c4fc39ac49db953d15e55c19c","modified":1573718510000},{"_id":"source/_posts/2019-11-14-AWS-KMS.md","hash":"519de77de3ffdcc67169130e36f8c53e20f3b2b6","modified":1573718604000},{"_id":"source/_posts/2020-03-18-leetcode-206.md","hash":"c80133bf68fc993ddc24517da4bc226764ae2a40","modified":1584546252000},{"_id":"source/_posts/2020-03-23-leetcode-225.md","hash":"aff4492c0c07d0d31b0313b5ef9378279233141b","modified":1584977724000},{"_id":"source/_posts/2020-03-23-leetcode-169.md","hash":"f193c41627501ed7235459d5ad40fd3d6ebf0a71","modified":1584976429000},{"_id":"source/_posts/2020-03-25-leetcode-409.md","hash":"f0e210e4da442e66e4436f7055f673c4655907f0","modified":1585144554000},{"_id":"source/_posts/2020-03-25-leetcode-543.md","hash":"a6e406e0bca5aa834c99625f74ee38ae87324b7f","modified":1586878193000},{"_id":"source/_posts/2020-03-25-leetcode-836.md","hash":"cc9e68c7e2ea013086e1d6ae0c2b212c60cac573","modified":1585147304000},{"_id":"source/_posts/2020-03-29-leetcode-1013.md","hash":"4937a632273d945e4f258ef96d6ca8c2d8fe9f5b","modified":1585487711000},{"_id":"source/_posts/2020-03-26-leetcode-876.md","hash":"4905be27ad818ebc81d3938227d31d760c5631c4","modified":1585228750000},{"_id":"source/_posts/2020-03-29-leetcode-914.md","hash":"a0631cf342a08f5ff9ad4d0ca2bf8372dca60ecc","modified":1585493527000},{"_id":"source/_posts/2020-03-30-leetcode-1071.md","hash":"affa6c07b877b5fa46873eca5ca300db4f24efb6","modified":1585577057000},{"_id":"source/_posts/2020-03-30-leetcode-999.md","hash":"41bd6e2ce8483d5d158b88d28ee63ec1551ca10a","modified":1585573421000},{"_id":"source/_posts/2020-04-01-leetcode-1103.md","hash":"c76f58bceaa6aafb010e7163f3ef893573c2a45f","modified":1586366247000},{"_id":"source/_posts/2020-04-01-leetcode-1160.md","hash":"bb2daed56d6bfb2cd930afb2e3c9b0ebb6e597bd","modified":1585727826000},{"_id":"source/_posts/2020-04-01-leetcode-compress-string-lcci.md","hash":"254b0bffa89a3d5711f8b3f45f1d05f23f27fac9","modified":1585727846000},{"_id":"source/_posts/2020-04-09-leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof.md","hash":"d1801e8c1bfff064a59cd43bc800226a193ef6b0","modified":1586878180000},{"_id":"source/_posts/2020-04-14-leetcode-add-two-numbers-ii.md","hash":"ebed1ea3f1229f6109e812cbb0f7e203f7312e0b","modified":1586878115000},{"_id":"source/_posts/2020-04-09-leetcode-the-masseuse-lcci.md","hash":"914948de11976b4d0db287c5beb1f4e40b71f7a7","modified":1586366044000},{"_id":"source/_posts/2020-04-16-leetcode-01-matrix.md","hash":"e29a270941ba47ad981089856d75640cc468f956","modified":1587011216000},{"_id":"source/_posts/2020-04-14-leetcode-design-twitter.md","hash":"f5e5079109ad996244e2cd9ed7a23976b6fd872c","modified":1586878174000},{"_id":"source/_posts/2020-04-16-leetcode-merge-intervals.md","hash":"4c8e56c27ec095f80ab803a819c83d60ffb6c697","modified":1587036168000},{"_id":"source/_posts/2020-04-21-leetcode-number-of-islands.md","hash":"766d66e49da9072f4e8afa0229b744e9407eed7a","modified":1587444946000},{"_id":"source/_posts/2020-04-16-leetcode-string-to-integer-atoi.md","hash":"903c766c73dd8ed9d1baf081b113113eef0740fa","modified":1587038200000},{"_id":"source/_posts/Postgresql Partitioning.md","hash":"63d88ca7c739c3153d63c7ca0f03c7fbc6708bb0","modified":1573718510000},{"_id":"source/_posts/Django-Manager-Method.md","hash":"5d83851ffbe6d2077a87ef66a7c11e1b13546c1f","modified":1526396315000},{"_id":"source/_posts/Flask-Day-1.md","hash":"19976eabe8d244b085108beb57116b81cabcc693","modified":1526396315000},{"_id":"source/_posts/Flask-Day-2.md","hash":"fea0129a559b2e76aa6927d5df528acd357fe3c9","modified":1526396315000},{"_id":"source/_posts/Tastypie.md","hash":"9b9d53979b98fcdca24c2ad8dc8a78c1dc77a665","modified":1526396315000},{"_id":"source/_posts/first-post.md","hash":"0cfe954d5b7b12d46dd20fe43e95835b89b30163","modified":1526396315000},{"_id":"themes/apollo/.git/HEAD","hash":"acbaef275e46a7f14c1ef456fff2c8bbe8c84724","modified":1526396315000},{"_id":"source/_posts/TastyPie-Note-1.md","hash":"843365f5f5b6142bba6ea900818d19848e3f070b","modified":1526396315000},{"_id":"themes/apollo/.git/config","hash":"e8486e77527181934f2dda23e50b879ab7641244","modified":1526396315000},{"_id":"themes/apollo/.git/description","hash":"9635f1b7e12c045212819dd934d809ef07efa2f4","modified":1526396315000},{"_id":"themes/apollo/.git/index","hash":"3aafcb5c0dca1df92022e4f3167231547c5e79e0","modified":1527846627000},{"_id":"themes/apollo/.git/packed-refs","hash":"0b13c31fe5e09d24b87c9bb547eaa0645fbfd2dc","modified":1526396315000},{"_id":"themes/apollo/doc/doc-en.md","hash":"1bccce1d01f085aedcb01317d2db23ca61351f13","modified":1526396315000},{"_id":"themes/apollo/languages/zh-cn.yml","hash":"9e4b03e14c094000257ea254fd660dde4c7af63c","modified":1526396315000},{"_id":"themes/apollo/doc/doc-zh.md","hash":"3aad2ed65922f6f5dd9731301195474d16a8a9be","modified":1526396315000},{"_id":"themes/apollo/languages/en.yml","hash":"65998758dd27a350b6d4f2dc803970a9c89978da","modified":1526396315000},{"_id":"themes/apollo/layout/index.jade","hash":"58c451042cad5beeb5a76852bba609c651ff3428","modified":1526396315000},{"_id":"themes/apollo/source/favicon.png","hash":"a72e4ae6672cdf2b1e3b018bbca3e3911771d873","modified":1526399879000},{"_id":"themes/apollo/source/logo.png","hash":"42de93a9e76ef2a1a3e42526169a9d1c844a3f5d","modified":1526396315000},{"_id":"themes/apollo/layout/post.jade","hash":"33ab46ab3736e5d51388939858647942ce375b9b","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/commit-msg.sample","hash":"ee1ed5aad98a435f2020b6de35c173b75d9affac","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/applypatch-msg.sample","hash":"86b9655a9ebbde13ac8dd5795eb4d5b539edab0f","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/post-update.sample","hash":"b614c2f63da7dca9f1db2e7ade61ef30448fc96c","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/pre-commit.sample","hash":"36aed8976dcc08b5076844f0ec645b18bc37758f","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/pre-applypatch.sample","hash":"42fa41564917b44183a50c4d94bb03e1768ddad8","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/pre-push.sample","hash":"b4ad74c989616b7395dc6c9fce9871bb1e86dfb5","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/prepare-commit-msg.sample","hash":"2b6275eda365cad50d167fe3a387c9bc9fedd54f","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/pre-rebase.sample","hash":"5885a56ab4fca8075a05a562d005e922cde9853b","modified":1526396315000},{"_id":"themes/apollo/.git/info/exclude","hash":"c879df015d97615050afa7b9641e3352a1e701ac","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/update.sample","hash":"39355a075977d05708ef74e1b66d09a36e486df1","modified":1526396315000},{"_id":"themes/apollo/.git/logs/HEAD","hash":"ff18dd6e76ec3e861fb0bc3789225625abd19928","modified":1526396315000},{"_id":"themes/apollo/layout/mixins/paginator.jade","hash":"f4ee2fb61a32e199b48cf93771749edc8a007391","modified":1526396315000},{"_id":"themes/apollo/layout/mixins/post.jade","hash":"e3c78a617191a2feafd360a5ddbc5cceeae4cf21","modified":1526396315000},{"_id":"themes/apollo/layout/partial/head.jade","hash":"51b2ba6a1cebb275730eb7131eea211c91f0986a","modified":1526396315000},{"_id":"themes/apollo/layout/partial/copyright.jade","hash":"2e2ee43c7241279a32b8c1386a2dea1409ef0e1c","modified":1526396315000},{"_id":"themes/apollo/layout/partial/comment.jade","hash":"ff0a2c269c2434da2ac5529872f1d6184a71f96d","modified":1526396315000},{"_id":"themes/apollo/layout/partial/layout.jade","hash":"d596c281bbba02cf8837f25f8ac0ac06e3d10e72","modified":1526396315000},{"_id":"themes/apollo/layout/partial/nav.jade","hash":"c35d3061da4b053b73150d9741c542d660798270","modified":1526396315000},{"_id":"themes/apollo/source/scss/apollo.scss","hash":"2f0ecd6ea1fec0aad4097dcb509b5ed5d1badd5c","modified":1526396315000},{"_id":"themes/apollo/layout/partial/scripts.jade","hash":"4c83fec1e2fc5cffefafc2e31835e28122c0fdfd","modified":1526396315000},{"_id":"themes/apollo/source/css/apollo.css","hash":"3769b55e027697d6d163ddf82b664b16c767ba9c","modified":1526396315000},{"_id":"themes/apollo/.git/objects/pack/pack-35ea6b850205f59708ed992c93c7cea2251cc278.idx","hash":"6a8c6fe9f118fb534f32f6c5d4811ef895340eba","modified":1526396315000},{"_id":"themes/apollo/.git/refs/heads/master","hash":"d32e5811a7e998bca04209572d5265585c606fdb","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/base.scss","hash":"88b361e68475caddbab763feed5e1db788ac2cd7","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/copyright.scss","hash":"7fc843c37a4dbf9f6e70770398841a73465ec642","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/footer.scss","hash":"094aca6e52f11b139ac7980ca03fa7b9d8fc7b2f","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/header.scss","hash":"d24cc6520f3faa7bb80610b858a92639eadcc289","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/home-post-list.scss","hash":"92858015b8f3dcb4eb91b6dc41563b7aaa91b376","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/mq.scss","hash":"0b9c7097136ac8e4a07d9702fc4dbe0345ac7596","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/post.scss","hash":"3ba64c410edd07e7bf5e9900d9ad9d76f2ff5828","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/normalize.scss","hash":"fd0b27bed6f103ea95b08f698ea663ff576dbcf1","modified":1526396315000},{"_id":"themes/apollo/.git/logs/refs/heads/master","hash":"ff18dd6e76ec3e861fb0bc3789225625abd19928","modified":1526396315000},{"_id":"themes/apollo/.git/refs/remotes/origin/HEAD","hash":"d9427cda09aba1cdde5c69c2b13c905bddb0bc51","modified":1526396315000},{"_id":"themes/apollo/.git/objects/pack/pack-35ea6b850205f59708ed992c93c7cea2251cc278.pack","hash":"b17d2960aef474cbff89c4c250ecaffff7c4790c","modified":1526396315000},{"_id":"themes/apollo/.git/logs/refs/remotes/origin/HEAD","hash":"ff18dd6e76ec3e861fb0bc3789225625abd19928","modified":1526396315000},{"_id":"public/atom.xml","hash":"a586321e90ce8456a406696b75b6c9bb17404570","modified":1587444952445},{"_id":"public/sitemap.xml","hash":"d316f7e351e88d31b23877fd010cb44b8087c840","modified":1587444952445},{"_id":"public/archives/index.html","hash":"fe7770520a4482f260261ffeff1bbee3299b8a23","modified":1587446402798},{"_id":"public/archives/2020/index.html","hash":"251bc2a11c2e05f962224521db20f4e220573608","modified":1587446402799},{"_id":"public/archives/2020/page/3/index.html","hash":"29030651310410cb57239babf6e003a2fdd6e980","modified":1587446402799},{"_id":"public/archives/page/2/index.html","hash":"9e6b4caccf0e9b14c1328a18fa946a8bfba6f2a3","modified":1587446402799},{"_id":"public/archives/2020/03/index.html","hash":"234393043bcd67e4e8efcc18f8b216277df715b0","modified":1587446402799},{"_id":"public/archives/2020/04/index.html","hash":"eb1fb49123a961d0927bc97b5074b0c9da56841b","modified":1587446402799},{"_id":"public/categories/leetcode/index.html","hash":"5fa307b686bfb8d48b609df293f9c817262352c1","modified":1587446402799},{"_id":"public/categories/leetcode/page/3/index.html","hash":"6ca07e52142b74cfbf2848d2c176b7e8fd0cad15","modified":1587446402799},{"_id":"public/index.html","hash":"5bf276e85ab585ee24e3cd01bf7b29508112d3b3","modified":1587446402800},{"_id":"public/page/2/index.html","hash":"4be6e473c0a3556143362acf12d9c6853ff1d1b7","modified":1587446402800},{"_id":"public/archives/2020/page/2/index.html","hash":"7959aa328aeb2c26a7b067bcab175c7447bc9986","modified":1587446402799},{"_id":"public/archives/2020/03/page/2/index.html","hash":"de542e40de5442276152044a8a79b57e334b6f3f","modified":1587446402799},{"_id":"public/categories/leetcode/page/2/index.html","hash":"7333305ab06f4d1b1a2b2a5402434bd74727c1f6","modified":1587446402799},{"_id":"public/2020/04/16/leetcode-string-to-integer-atoi/index.html","hash":"5aab7acb06a04909d65f2b37791fe020ac6b4b34","modified":1587446402800},{"_id":"public/2020/04/16/leetcode-01-matrix/index.html","hash":"a59789fc1b8e3e63ae66c5fe582eafd3d4bf2cf1","modified":1587446402800},{"_id":"public/2020/04/16/leetcode-merge-intervals/index.html","hash":"fe43c579b065f030836acf7adf640709bc382339","modified":1587446402800},{"_id":"public/2020/04/14/leetcode-design-twitter/index.html","hash":"4b22f200f0d627c187aa57b18192c1cf46bff91c","modified":1587446402800},{"_id":"public/2020/04/14/leetcode-add-two-numbers-ii/index.html","hash":"1cf8ed5b32d2522f46e1dbf33b351ccb2469de70","modified":1587446402800},{"_id":"public/2020/04/01/leetcode-1103/index.html","hash":"9df68a878761dd1c23aee8cff693137fba062b42","modified":1587446402800},{"_id":"public/2020/04/01/leetcode-compress-string-lcci/index.html","hash":"1692319e76fdba90f4a4835d07dd68956f2385d5","modified":1587446402800},{"_id":"public/2020/04/01/leetcode-1160/index.html","hash":"0f1c09bb7ac1e6a4ee43d6d729baa7e14fb75f8b","modified":1587446402800},{"_id":"public/2020/03/30/leetcode-999/index.html","hash":"bfb9f5ef24d32860c804e02028a3ec472a7f5c81","modified":1587446402800},{"_id":"public/2020/03/30/leetcode-1071/index.html","hash":"4dd54070b7ced7e45cee66a81a61d329600ffde5","modified":1587446402800},{"_id":"public/2020/03/26/leetcode-876/index.html","hash":"d08a6ebc25c304fdbb77cf5efbff3e3a9c66639e","modified":1587446402800},{"_id":"public/2020/03/29/leetcode-1013/index.html","hash":"68403102195d2c4b807802fc26419888c65b1cba","modified":1587446402800},{"_id":"public/2020/03/25/leetcode-543/index.html","hash":"b94a9b3f588cc5e11f6551737c753a1e2adf307e","modified":1587446402801},{"_id":"public/2020/03/29/leetcode-914/index.html","hash":"de4191f15d4a12e822c66b6d0196ee83482519a9","modified":1587446402800},{"_id":"public/2020/03/25/leetcode-836/index.html","hash":"66f352798839414ea29c6118f75d5af739c9d182","modified":1587446402800},{"_id":"public/2020/03/25/leetcode-409/index.html","hash":"41d70012826b76c402daba4f6875a9b52e55264e","modified":1587446402800},{"_id":"public/2020/03/17/leetcode-121/index.html","hash":"9c27e8c6c17fa24951b9857e5695c116df14b4d9","modified":1587446402801},{"_id":"public/2020/03/23/leetcode-169/index.html","hash":"ce2379b39051685a8e32a853d788517568dc4d5a","modified":1587446402801},{"_id":"public/2020/03/23/leetcode-225/index.html","hash":"73855dc29fed498d3c597a0e859001a611d3c47e","modified":1587446402801},{"_id":"public/2018/05/31/bash-function-and-awk/index.html","hash":"e8123f624cdce6ac8c87574232f17de4bd545fa3","modified":1587446402801},{"_id":"public/2019/03/12/Postgresql-Partitioning/index.html","hash":"a280187102a2eeeb1ef3a01a1aa51d4472b93622","modified":1587446402801},{"_id":"public/2019/11/14/AWS-KMS/index.html","hash":"ed7730b48b5c308a09e34064dada6c739b168649","modified":1587446402801},{"_id":"public/2016/05/04/Tastypie/index.html","hash":"b2279db518bc33249f19423ac18d92c4e516c9a6","modified":1587446402801},{"_id":"public/2016/04/25/Django-Manager-Method/index.html","hash":"5e97665a188021701f6904c80457a774ab7161dc","modified":1587446402801},{"_id":"public/2016/02/16/Flask-Day-2/index.html","hash":"b190b4056ab4d2b631a753ad4dec89e04e50e295","modified":1587446402801},{"_id":"public/2020/03/18/leetcode-206/index.html","hash":"867d48227994566c3bee90c1ea41bc05d8fd96f5","modified":1587446402801},{"_id":"public/2016/02/12/first-post/index.html","hash":"d9dfb8c5405c1df371cbadc058d7ea37735cf332","modified":1587446402801},{"_id":"public/2016/05/10/TastyPie-Note-1/index.html","hash":"ff6cb06b7bc1b9e4ea87caa9d4fde8e6264e699f","modified":1587446402801},{"_id":"public/archives/page/4/index.html","hash":"17c87e84bdd240a8c3872be7f954b117a6a0a64e","modified":1587446402801},{"_id":"public/archives/2016/04/index.html","hash":"ba5405758fae3205d45faebd9b6f6c29fabc6e0d","modified":1587446402801},{"_id":"public/2016/02/15/Flask-Day-1/index.html","hash":"70e1fe2be44fe1a1a2c47154a4ca14b77140ed5f","modified":1587446402801},{"_id":"public/archives/2016/05/index.html","hash":"9776f37ffc779f836f175a1a3cc7093d08db6d88","modified":1587446402801},{"_id":"public/archives/2018/index.html","hash":"f68186fdf1b5d2d4b17d60830ba45974a2a6edea","modified":1587446402801},{"_id":"public/archives/2018/05/index.html","hash":"f68186fdf1b5d2d4b17d60830ba45974a2a6edea","modified":1587446402802},{"_id":"public/archives/2019/index.html","hash":"b0ed0f0a97d72f877e32ca35f2e04446c31e87a5","modified":1587446402802},{"_id":"public/archives/2019/03/index.html","hash":"dea6c71318d3a5e846399723c08dd85e501cc853","modified":1587446402802},{"_id":"public/archives/2019/11/index.html","hash":"72c2812063a41e908ece68f6fb02693dabedb231","modified":1587446402802},{"_id":"public/page/4/index.html","hash":"3491fdf675901b32b4d7add96bf20afe0689f000","modified":1587446402802},{"_id":"public/2020/04/09/leetcode-the-masseuse-lcci/index.html","hash":"7aaf9401283dea109df78b0e9c15e4e1b019a97d","modified":1587446402802},{"_id":"public/2020/04/09/leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/index.html","hash":"03d56ffca8243eb43b68ca87c589cff370c75644","modified":1587446402802},{"_id":"public/archives/page/3/index.html","hash":"aebf39704d5f24dbc364347ad432a7a7f11f6fc3","modified":1587446402802},{"_id":"public/archives/2016/index.html","hash":"7f01421dc66b6f3e2cdece71a3e5e8220a126d03","modified":1587446402802},{"_id":"public/archives/2016/02/index.html","hash":"cb7d38e6a2726a642c10ec7799e1c8c7fbaa21f8","modified":1587446402802},{"_id":"public/page/3/index.html","hash":"823df38f48cc7ece2d0a3feebad02e0987f54ab2","modified":1587446402802},{"_id":"public/archives/2020/04/page/2/index.html","hash":"e2cabbebde42d90c7a379c2407b494ebe9718a58","modified":1587446402799},{"_id":"public/2020/04/21/leetcode-number-of-islands/index.html","hash":"03ccb0bb82762283b2945bb6d4bce77fa0dcb3b7","modified":1587446402800},{"_id":"public/logo.png","hash":"42de93a9e76ef2a1a3e42526169a9d1c844a3f5d","modified":1587444954000},{"_id":"public/scss/apollo.scss","hash":"2f0ecd6ea1fec0aad4097dcb509b5ed5d1badd5c","modified":1587444954000},{"_id":"public/CNAME","hash":"c53a99d8555292c2cc8dd02c564b9d5fdfed89cb","modified":1587444954000},{"_id":"public/favicon.png","hash":"a72e4ae6672cdf2b1e3b018bbca3e3911771d873","modified":1587444954000},{"_id":"public/css/apollo.css","hash":"3769b55e027697d6d163ddf82b664b16c767ba9c","modified":1587444954045}],"Category":[{"name":"leetcode","_id":"ck99fqk4a0002subunok11hn6"}],"Data":[],"Page":[],"Post":[{"title":"leetcode-121","date":"2020-03-17T10:06:45.000Z","_content":"\n### 121. 买卖股票的最佳时机\n\n[题目](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/)\n\n<!--more-->\n\n原始答案\n\n```python\nclass Solution:\n def maxProfit(self, prices) -> int:\n profit = 0\n if not prices:\n return profit\n min_buyin = prices[0]\n max_sellout = prices[0]\n l = len(prices)\n i = 0\n for buyin in prices:\n if i == l:\n return profit\n if min_buyin <= buyin:\n max_sellout = max(prices[i:])\n p = max_sellout - min_buyin\n if p > profit:\n profit = p\n if buyin < min_buyin:\n min_buyin = buyin\n i += 1\n return profit\n#1880 ms\t14.4 MB\n```\n\n主要思路是找到波谷如果当前价格比前一天要低则还是在去往波谷的路上当价格比前一天高或相同时则到达了一个波谷计算波谷和之后的波峰的差就是这一段的利润。将从头至尾过一次就能找到所有波谷和其后波峰的差返回最大的即可。但是这个明显地在重复max时间复杂度是O(n^2),看起来就很傻逼。\n\n仔细想想其实并不需要直接找出波谷后的波峰只要在for loop时保持波谷为最低的那个就能算出每一个后续与波谷的差找最大差即可。改了下代码变成这样\n\n```python\nclass Solution:\n def maxProfit(self, prices) -> int:\n profit = 0\n if not prices:\n return profit\n min_buyin = prices[0]\n for i in range(1, len(prices)):\n min_buyin = min(min_buyin, prices[i-1])\n profit = max(prices[i] - min_buyin, profit)\n return profit\n #44 ms\t14.4 MB\n```\n\n\n","source":"_posts/2020-03-17-leetcode-121.md","raw":"---\ntitle: leetcode-121\ndate: 2020-03-17 18:06:45\ntags:\ncategories: leetcode\n---\n\n### 121. 买卖股票的最佳时机\n\n[题目](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/)\n\n<!--more-->\n\n原始答案\n\n```python\nclass Solution:\n def maxProfit(self, prices) -> int:\n profit = 0\n if not prices:\n return profit\n min_buyin = prices[0]\n max_sellout = prices[0]\n l = len(prices)\n i = 0\n for buyin in prices:\n if i == l:\n return profit\n if min_buyin <= buyin:\n max_sellout = max(prices[i:])\n p = max_sellout - min_buyin\n if p > profit:\n profit = p\n if buyin < min_buyin:\n min_buyin = buyin\n i += 1\n return profit\n#1880 ms\t14.4 MB\n```\n\n主要思路是找到波谷如果当前价格比前一天要低则还是在去往波谷的路上当价格比前一天高或相同时则到达了一个波谷计算波谷和之后的波峰的差就是这一段的利润。将从头至尾过一次就能找到所有波谷和其后波峰的差返回最大的即可。但是这个明显地在重复max时间复杂度是O(n^2),看起来就很傻逼。\n\n仔细想想其实并不需要直接找出波谷后的波峰只要在for loop时保持波谷为最低的那个就能算出每一个后续与波谷的差找最大差即可。改了下代码变成这样\n\n```python\nclass Solution:\n def maxProfit(self, prices) -> int:\n profit = 0\n if not prices:\n return profit\n min_buyin = prices[0]\n for i in range(1, len(prices)):\n min_buyin = min(min_buyin, prices[i-1])\n profit = max(prices[i] - min_buyin, profit)\n return profit\n #44 ms\t14.4 MB\n```\n\n\n","slug":"leetcode-121","published":1,"updated":"2020-03-17T10:54:03.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk450000subu0lleqph1","content":"<h3 id=\"121-__u4E70_u5356_u80A1_u7968_u7684_u6700_u4F73_u65F6_u673A\"><a href=\"#121-__u4E70_u5356_u80A1_u7968_u7684_u6700_u4F73_u65F6_u673A\" class=\"headerlink\" title=\"121. 买卖股票的最佳时机\"></a>121. 买卖股票的最佳时机</h3><p><a href=\"https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/\" target=\"_blank\" rel=\"noopener\">题目</a></p>\n<a id=\"more\"></a>\n<p>原始答案:</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">maxProfit</span><span class=\"params\">(self, prices)</span> -&gt; int:</span></span><br><span class=\"line\"> profit = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> prices:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> profit</span><br><span class=\"line\"> min_buyin = prices[<span class=\"number\">0</span>]</span><br><span class=\"line\"> max_sellout = prices[<span class=\"number\">0</span>]</span><br><span class=\"line\"> l = len(prices)</span><br><span class=\"line\"> i = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> buyin <span class=\"keyword\">in</span> prices:</span><br><span class=\"line\"> <span class=\"keyword\">if</span> i == l:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> profit</span><br><span class=\"line\"> <span class=\"keyword\">if</span> min_buyin &lt;= buyin:</span><br><span class=\"line\"> max_sellout = max(prices[i:])</span><br><span class=\"line\"> p = max_sellout - min_buyin</span><br><span class=\"line\"> <span class=\"keyword\">if</span> p &gt; profit:</span><br><span class=\"line\"> profit = p</span><br><span class=\"line\"> <span class=\"keyword\">if</span> buyin &lt; min_buyin:</span><br><span class=\"line\"> min_buyin = buyin</span><br><span class=\"line\"> i += <span class=\"number\">1</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> profit</span><br><span class=\"line\"><span class=\"comment\">#1880 ms\t14.4 MB</span></span><br></pre></td></tr></table></figure>\n<p>主要思路是找到波谷如果当前价格比前一天要低则还是在去往波谷的路上当价格比前一天高或相同时则到达了一个波谷计算波谷和之后的波峰的差就是这一段的利润。将从头至尾过一次就能找到所有波谷和其后波峰的差返回最大的即可。但是这个明显地在重复max时间复杂度是O(n^2),看起来就很傻逼。</p>\n<p>仔细想想其实并不需要直接找出波谷后的波峰只要在for loop时保持波谷为最低的那个就能算出每一个后续与波谷的差找最大差即可。改了下代码变成这样</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">maxProfit</span><span class=\"params\">(self, prices)</span> -&gt; int:</span></span><br><span class=\"line\"> profit = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> prices:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> profit</span><br><span class=\"line\"> min_buyin = prices[<span class=\"number\">0</span>]</span><br><span class=\"line\"> <span class=\"keyword\">for</span> i <span class=\"keyword\">in</span> range(<span class=\"number\">1</span>, len(prices)):</span><br><span class=\"line\"> min_buyin = min(min_buyin, prices[i<span class=\"number\">-1</span>])</span><br><span class=\"line\"> profit = max(prices[i] - min_buyin, profit)</span><br><span class=\"line\"> <span class=\"keyword\">return</span> profit</span><br><span class=\"line\"> <span class=\"comment\">#44 ms\t14.4 MB</span></span><br></pre></td></tr></table></figure>\n","site":{"data":{}},"excerpt":"<h3 id=\"121-__u4E70_u5356_u80A1_u7968_u7684_u6700_u4F73_u65F6_u673A\"><a href=\"#121-__u4E70_u5356_u80A1_u7968_u7684_u6700_u4F73_u65F6_u673A\" class=\"headerlink\" title=\"121. 买卖股票的最佳时机\"></a>121. 买卖股票的最佳时机</h3><p><a href=\"https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/\" target=\"_blank\" rel=\"noopener\">题目</a></p>","more":"<p>原始答案:</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">maxProfit</span><span class=\"params\">(self, prices)</span> -&gt; int:</span></span><br><span class=\"line\"> profit = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> prices:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> profit</span><br><span class=\"line\"> min_buyin = prices[<span class=\"number\">0</span>]</span><br><span class=\"line\"> max_sellout = prices[<span class=\"number\">0</span>]</span><br><span class=\"line\"> l = len(prices)</span><br><span class=\"line\"> i = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> buyin <span class=\"keyword\">in</span> prices:</span><br><span class=\"line\"> <span class=\"keyword\">if</span> i == l:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> profit</span><br><span class=\"line\"> <span class=\"keyword\">if</span> min_buyin &lt;= buyin:</span><br><span class=\"line\"> max_sellout = max(prices[i:])</span><br><span class=\"line\"> p = max_sellout - min_buyin</span><br><span class=\"line\"> <span class=\"keyword\">if</span> p &gt; profit:</span><br><span class=\"line\"> profit = p</span><br><span class=\"line\"> <span class=\"keyword\">if</span> buyin &lt; min_buyin:</span><br><span class=\"line\"> min_buyin = buyin</span><br><span class=\"line\"> i += <span class=\"number\">1</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> profit</span><br><span class=\"line\"><span class=\"comment\">#1880 ms\t14.4 MB</span></span><br></pre></td></tr></table></figure>\n<p>主要思路是找到波谷如果当前价格比前一天要低则还是在去往波谷的路上当价格比前一天高或相同时则到达了一个波谷计算波谷和之后的波峰的差就是这一段的利润。将从头至尾过一次就能找到所有波谷和其后波峰的差返回最大的即可。但是这个明显地在重复max时间复杂度是O(n^2),看起来就很傻逼。</p>\n<p>仔细想想其实并不需要直接找出波谷后的波峰只要在for loop时保持波谷为最低的那个就能算出每一个后续与波谷的差找最大差即可。改了下代码变成这样</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">maxProfit</span><span class=\"params\">(self, prices)</span> -&gt; int:</span></span><br><span class=\"line\"> profit = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> prices:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> profit</span><br><span class=\"line\"> min_buyin = prices[<span class=\"number\">0</span>]</span><br><span class=\"line\"> <span class=\"keyword\">for</span> i <span class=\"keyword\">in</span> range(<span class=\"number\">1</span>, len(prices)):</span><br><span class=\"line\"> min_buyin = min(min_buyin, prices[i<span class=\"number\">-1</span>])</span><br><span class=\"line\"> profit = max(prices[i] - min_buyin, profit)</span><br><span class=\"line\"> <span class=\"keyword\">return</span> profit</span><br><span class=\"line\"> <span class=\"comment\">#44 ms\t14.4 MB</span></span><br></pre></td></tr></table></figure>"},{"title":"bash function and awk","date":"2018-05-30T16:00:48.000Z","_content":"\n\n\nI'll come across many hg branch-switching or log searching tasks during my work. Using bash functions and awk greatly reduce the time I spend on dealing with these tasks. So let's see what these functions can do to help me improve my productivity.\n\n\n\n#### bash functions\n\nBash functions are scripts like `alias`, but can do much a lot than aliasThe first kind of usages of function is to run several scripts continuously, the same as `&&` I guess:\n\n```bash\nfunction run {\n source ~/Develop/django/bin/activate\n ./manage.py runserver\n}\n```\n\nI activate django virtural enviroment first and then run django serve.\n\nFunctions, like in any other languages, can take parameters and returns a result. So I can use this ability to do a liitle more complex work:\n\n```bash\nfunction ba { hgba | grep \"$1\" }\n# hgba is an alias for hg branches\n```\n\nI can just type `ba release` then get current release branch info.\n\n-----\n\nAppend:\n\nI made some updates to the `ba` function and make it auto copying the branch result to my clipboard:\n\n```bash\n\nfunction ba { var=\"$(hgba | grep $1)\" && echo $var | awk -F ':' END{print} | awk -F ':' '{print $NF}' | tr -d '\\n' | pbcopy && echo $var }\n```\n\n\n\n#### awk\n\n`awk` is a command I just know recently. I need to process a bunch of logs and analyze them. What I used to do is download the logs, grep things I want into a txt file and then process the txt file with python. \n\n\n","source":"_posts/2018-05-31-bash-function-and-awk.md","raw":"---\ntitle: bash function and awk\ndate: 2018-05-31 00:00:48\ntags:\n---\n\n\n\nI'll come across many hg branch-switching or log searching tasks during my work. Using bash functions and awk greatly reduce the time I spend on dealing with these tasks. So let's see what these functions can do to help me improve my productivity.\n\n\n\n#### bash functions\n\nBash functions are scripts like `alias`, but can do much a lot than aliasThe first kind of usages of function is to run several scripts continuously, the same as `&&` I guess:\n\n```bash\nfunction run {\n source ~/Develop/django/bin/activate\n ./manage.py runserver\n}\n```\n\nI activate django virtural enviroment first and then run django serve.\n\nFunctions, like in any other languages, can take parameters and returns a result. So I can use this ability to do a liitle more complex work:\n\n```bash\nfunction ba { hgba | grep \"$1\" }\n# hgba is an alias for hg branches\n```\n\nI can just type `ba release` then get current release branch info.\n\n-----\n\nAppend:\n\nI made some updates to the `ba` function and make it auto copying the branch result to my clipboard:\n\n```bash\n\nfunction ba { var=\"$(hgba | grep $1)\" && echo $var | awk -F ':' END{print} | awk -F ':' '{print $NF}' | tr -d '\\n' | pbcopy && echo $var }\n```\n\n\n\n#### awk\n\n`awk` is a command I just know recently. I need to process a bunch of logs and analyze them. What I used to do is download the logs, grep things I want into a txt file and then process the txt file with python. \n\n\n","slug":"bash-function-and-awk","published":1,"updated":"2019-11-14T08:01:50.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk490001sububwxed4yb","content":"<p>Ill come across many hg branch-switching or log searching tasks during my work. Using bash functions and awk greatly reduce the time I spend on dealing with these tasks. So lets see what these functions can do to help me improve my productivity.</p>\n<h4 id=\"bash_functions\"><a href=\"#bash_functions\" class=\"headerlink\" title=\"bash functions\"></a>bash functions</h4><p>Bash functions are scripts like <code>alias</code>, but can do much a lot than aliasThe first kind of usages of function is to run several scripts continuously, the same as <code>&amp;&amp;</code> I guess:</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">function</span> run &#123;</span><br><span class=\"line\"> <span class=\"built_in\">source</span> ~/Develop/django/bin/activate</span><br><span class=\"line\"> ./manage.py runserver</span><br><span class=\"line\">&#125;</span><br></pre></td></tr></table></figure>\n<p>I activate django virtural enviroment first and then run django serve.</p>\n<p>Functions, like in any other languages, can take parameters and returns a result. So I can use this ability to do a liitle more complex work:</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">function</span> ba &#123; hgba | grep <span class=\"string\">\"<span class=\"variable\">$1</span>\"</span> &#125;</span><br><span class=\"line\"><span class=\"comment\"># hgba is an alias for hg branches</span></span><br></pre></td></tr></table></figure>\n<p>I can just type <code>ba release</code> then get current release branch info.</p>\n<hr>\n<p>Append:</p>\n<p>I made some updates to the <code>ba</code> function and make it auto copying the branch result to my clipboard:</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"></span><br><span class=\"line\"><span class=\"keyword\">function</span> ba &#123; var=<span class=\"string\">\"<span class=\"variable\">$(hgba | grep $1)</span>\"</span> &amp;&amp; <span class=\"built_in\">echo</span> <span class=\"variable\">$var</span> | awk -F <span class=\"string\">':'</span> END&#123;<span class=\"built_in\">print</span>&#125; | awk -F <span class=\"string\">':'</span> <span class=\"string\">'&#123;print $NF&#125;'</span> | tr -d <span class=\"string\">'\\n'</span> | pbcopy &amp;&amp; <span class=\"built_in\">echo</span> <span class=\"variable\">$var</span> &#125;</span><br></pre></td></tr></table></figure>\n<h4 id=\"awk\"><a href=\"#awk\" class=\"headerlink\" title=\"awk\"></a>awk</h4><p><code>awk</code> is a command I just know recently. I need to process a bunch of logs and analyze them. What I used to do is download the logs, grep things I want into a txt file and then process the txt file with python. </p>\n","site":{"data":{}},"excerpt":"","more":"<p>Ill come across many hg branch-switching or log searching tasks during my work. Using bash functions and awk greatly reduce the time I spend on dealing with these tasks. So lets see what these functions can do to help me improve my productivity.</p>\n<h4 id=\"bash_functions\"><a href=\"#bash_functions\" class=\"headerlink\" title=\"bash functions\"></a>bash functions</h4><p>Bash functions are scripts like <code>alias</code>, but can do much a lot than aliasThe first kind of usages of function is to run several scripts continuously, the same as <code>&amp;&amp;</code> I guess:</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">function</span> run &#123;</span><br><span class=\"line\"> <span class=\"built_in\">source</span> ~/Develop/django/bin/activate</span><br><span class=\"line\"> ./manage.py runserver</span><br><span class=\"line\">&#125;</span><br></pre></td></tr></table></figure>\n<p>I activate django virtural enviroment first and then run django serve.</p>\n<p>Functions, like in any other languages, can take parameters and returns a result. So I can use this ability to do a liitle more complex work:</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">function</span> ba &#123; hgba | grep <span class=\"string\">\"<span class=\"variable\">$1</span>\"</span> &#125;</span><br><span class=\"line\"><span class=\"comment\"># hgba is an alias for hg branches</span></span><br></pre></td></tr></table></figure>\n<p>I can just type <code>ba release</code> then get current release branch info.</p>\n<hr>\n<p>Append:</p>\n<p>I made some updates to the <code>ba</code> function and make it auto copying the branch result to my clipboard:</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"></span><br><span class=\"line\"><span class=\"keyword\">function</span> ba &#123; var=<span class=\"string\">\"<span class=\"variable\">$(hgba | grep $1)</span>\"</span> &amp;&amp; <span class=\"built_in\">echo</span> <span class=\"variable\">$var</span> | awk -F <span class=\"string\">':'</span> END&#123;<span class=\"built_in\">print</span>&#125; | awk -F <span class=\"string\">':'</span> <span class=\"string\">'&#123;print $NF&#125;'</span> | tr -d <span class=\"string\">'\\n'</span> | pbcopy &amp;&amp; <span class=\"built_in\">echo</span> <span class=\"variable\">$var</span> &#125;</span><br></pre></td></tr></table></figure>\n<h4 id=\"awk\"><a href=\"#awk\" class=\"headerlink\" title=\"awk\"></a>awk</h4><p><code>awk</code> is a command I just know recently. I need to process a bunch of logs and analyze them. What I used to do is download the logs, grep things I want into a txt file and then process the txt file with python. </p>\n"},{"title":"AWS KMS","date":"2019-11-14T07:19:05.000Z","_content":"\nWe used to keep private credentials on production servers without any protection or encryption. Well, luckily we don't have any leak but this practice is not recommended for both security and easy of use reasons.\n\nSince AWS finally provides [KMS(Key Management Service)][1] in our local region, we try to encrypt every private credentials by KMS and store them on S3.\n\n*TBD*\n\n\n[1]: https://www.amazonaws.cn/kms/","source":"_posts/2019-11-14-AWS-KMS.md","raw":"---\ntitle: AWS KMS\ndate: 2019-11-14 15:19:05\ntags:\n---\n\nWe used to keep private credentials on production servers without any protection or encryption. Well, luckily we don't have any leak but this practice is not recommended for both security and easy of use reasons.\n\nSince AWS finally provides [KMS(Key Management Service)][1] in our local region, we try to encrypt every private credentials by KMS and store them on S3.\n\n*TBD*\n\n\n[1]: https://www.amazonaws.cn/kms/","slug":"AWS-KMS","published":1,"updated":"2019-11-14T08:03:24.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4b0003subucvx7m2kw","content":"<p>We used to keep private credentials on production servers without any protection or encryption. Well, luckily we dont have any leak but this practice is not recommended for both security and easy of use reasons.</p>\n<p>Since AWS finally provides <a href=\"https://www.amazonaws.cn/kms/\" target=\"_blank\" rel=\"noopener\">KMS(Key Management Service)</a> in our local region, we try to encrypt every private credentials by KMS and store them on S3.</p>\n<p><em>TBD</em></p>\n","site":{"data":{}},"excerpt":"","more":"<p>We used to keep private credentials on production servers without any protection or encryption. Well, luckily we dont have any leak but this practice is not recommended for both security and easy of use reasons.</p>\n<p>Since AWS finally provides <a href=\"https://www.amazonaws.cn/kms/\" target=\"_blank\" rel=\"noopener\">KMS(Key Management Service)</a> in our local region, we try to encrypt every private credentials by KMS and store them on S3.</p>\n<p><em>TBD</em></p>\n"},{"title":"leetcode-206","date":"2020-03-18T15:33:03.000Z","_content":"\n### 206. 反转链表\n\n[题目](https://leetcode-cn.com/problems/reverse-linked-list/)\n\n<!--more-->\n\n最简单的思路是遍历链表一个列表去做存储通过倒序读取列表的同时改写链表。\n\n```python\nclass ListNode:\n def __init__(self, x):\n self.val = x\n self.next = None\n\nclass Solution:\n def reverseList(self, head):\n if not head or not head.next:\n return head\n nl = []\n while head.next:\n nl.append(head)\n head = head.next\n nl.append(head)\n l = len(nl)\n for x in range(l):\n if x == 0:\n nl[x].next = None\n continue\n nl[x].next = nl[x-1]\n if x == (l - 1):\n return nl[x]\n```\n\n仔细想想自己又傻逼了何必要遍历两次呢在第一遍遍历的同时就能操作了\n\n```python\nclass Solution:\n def reverseList(self, head):\n if not head or not head.next:\n return head\n prev_node = None\n next_node = head.next\n while head:\n next_node = head.next\n head.next = prev_node\n prev_node = head\n head = next_node\n return prev_node\n```\n\n然后是递归的做法主要思路是一直进到最深一层--也就是链表的最后一个--的时候开始返回,同时修改那一层的两个 node。一开始踩了一个坑是返回了每一个node结果最后回到第一层的时候得到的是链表的末端其实只需要修改链表并不需要返回 node所以一开始到达链表末端的时候直接返回那一个node就可以了。\n\n```python\nclass Solution:\n def reverseList(self, head):\n if not head:\n return head\n if head.next:\n ss = Solution()\n last = ss.reverseList(head.next)\n head.next.next = head\n head.next = None\n return last\n return head\n```\n\n一开始是用list来打草稿不过想明白递归之后就大同小异了\n\n```python\ndef a(l:list)->list:\n k=[l[0]]\n\n if l[1:]:\n b=a(l[1:])\n b.extend(k)\n else:\n return [l[0]]\n return b\n```\n\n\n","source":"_posts/2020-03-18-leetcode-206.md","raw":"---\ntitle: leetcode-206\ndate: 2020-03-18 23:33:03\ntags:\ncategories: leetcode\n---\n\n### 206. 反转链表\n\n[题目](https://leetcode-cn.com/problems/reverse-linked-list/)\n\n<!--more-->\n\n最简单的思路是遍历链表一个列表去做存储通过倒序读取列表的同时改写链表。\n\n```python\nclass ListNode:\n def __init__(self, x):\n self.val = x\n self.next = None\n\nclass Solution:\n def reverseList(self, head):\n if not head or not head.next:\n return head\n nl = []\n while head.next:\n nl.append(head)\n head = head.next\n nl.append(head)\n l = len(nl)\n for x in range(l):\n if x == 0:\n nl[x].next = None\n continue\n nl[x].next = nl[x-1]\n if x == (l - 1):\n return nl[x]\n```\n\n仔细想想自己又傻逼了何必要遍历两次呢在第一遍遍历的同时就能操作了\n\n```python\nclass Solution:\n def reverseList(self, head):\n if not head or not head.next:\n return head\n prev_node = None\n next_node = head.next\n while head:\n next_node = head.next\n head.next = prev_node\n prev_node = head\n head = next_node\n return prev_node\n```\n\n然后是递归的做法主要思路是一直进到最深一层--也就是链表的最后一个--的时候开始返回,同时修改那一层的两个 node。一开始踩了一个坑是返回了每一个node结果最后回到第一层的时候得到的是链表的末端其实只需要修改链表并不需要返回 node所以一开始到达链表末端的时候直接返回那一个node就可以了。\n\n```python\nclass Solution:\n def reverseList(self, head):\n if not head:\n return head\n if head.next:\n ss = Solution()\n last = ss.reverseList(head.next)\n head.next.next = head\n head.next = None\n return last\n return head\n```\n\n一开始是用list来打草稿不过想明白递归之后就大同小异了\n\n```python\ndef a(l:list)->list:\n k=[l[0]]\n\n if l[1:]:\n b=a(l[1:])\n b.extend(k)\n else:\n return [l[0]]\n return b\n```\n\n\n","slug":"leetcode-206","published":1,"updated":"2020-03-18T15:44:12.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4c0004subueeqgf7uv","content":"<h3 id=\"206-__u53CD_u8F6C_u94FE_u8868\"><a href=\"#206-__u53CD_u8F6C_u94FE_u8868\" class=\"headerlink\" title=\"206. 反转链表\"></a>206. 反转链表</h3><p><a href=\"https://leetcode-cn.com/problems/reverse-linked-list/\" target=\"_blank\" rel=\"noopener\">题目</a></p>\n<a id=\"more\"></a>\n<p>最简单的思路是遍历链表一个列表去做存储,通过倒序读取列表的同时改写链表。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">ListNode</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">__init__</span><span class=\"params\">(self, x)</span>:</span></span><br><span class=\"line\"> self.val = x</span><br><span class=\"line\"> self.next = <span class=\"keyword\">None</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">reverseList</span><span class=\"params\">(self, head)</span>:</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> head <span class=\"keyword\">or</span> <span class=\"keyword\">not</span> head.next:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> head</span><br><span class=\"line\"> nl = []</span><br><span class=\"line\"> <span class=\"keyword\">while</span> head.next:</span><br><span class=\"line\"> nl.append(head)</span><br><span class=\"line\"> head = head.next</span><br><span class=\"line\"> nl.append(head)</span><br><span class=\"line\"> l = len(nl)</span><br><span class=\"line\"> <span class=\"keyword\">for</span> x <span class=\"keyword\">in</span> range(l):</span><br><span class=\"line\"> <span class=\"keyword\">if</span> x == <span class=\"number\">0</span>:</span><br><span class=\"line\"> nl[x].next = <span class=\"keyword\">None</span></span><br><span class=\"line\"> <span class=\"keyword\">continue</span></span><br><span class=\"line\"> nl[x].next = nl[x<span class=\"number\">-1</span>]</span><br><span class=\"line\"> <span class=\"keyword\">if</span> x == (l - <span class=\"number\">1</span>):</span><br><span class=\"line\"> <span class=\"keyword\">return</span> nl[x]</span><br></pre></td></tr></table></figure>\n<p>仔细想想自己又傻逼了,何必要遍历两次呢,在第一遍遍历的同时就能操作了:</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">reverseList</span><span class=\"params\">(self, head)</span>:</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> head <span class=\"keyword\">or</span> <span class=\"keyword\">not</span> head.next:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> head</span><br><span class=\"line\"> prev_node = <span class=\"keyword\">None</span></span><br><span class=\"line\"> next_node = head.next</span><br><span class=\"line\"> <span class=\"keyword\">while</span> head:</span><br><span class=\"line\"> next_node = head.next</span><br><span class=\"line\"> head.next = prev_node</span><br><span class=\"line\"> prev_node = head</span><br><span class=\"line\"> head = next_node</span><br><span class=\"line\"> <span class=\"keyword\">return</span> prev_node</span><br></pre></td></tr></table></figure>\n<p>然后是递归的做法,主要思路是一直进到最深一层–也就是链表的最后一个–的时候开始返回,同时修改那一层的两个 node。一开始踩了一个坑是返回了每一个node结果最后回到第一层的时候得到的是链表的末端其实只需要修改链表并不需要返回 node所以一开始到达链表末端的时候直接返回那一个node就可以了。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">reverseList</span><span class=\"params\">(self, head)</span>:</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> head:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> head</span><br><span class=\"line\"> <span class=\"keyword\">if</span> head.next:</span><br><span class=\"line\"> ss = Solution()</span><br><span class=\"line\"> last = ss.reverseList(head.next)</span><br><span class=\"line\"> head.next.next = head</span><br><span class=\"line\"> head.next = <span class=\"keyword\">None</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> last</span><br><span class=\"line\"> <span class=\"keyword\">return</span> head</span><br></pre></td></tr></table></figure>\n<p>一开始是用list来打草稿不过想明白递归之后就大同小异了</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">a</span><span class=\"params\">(l:list)</span>-&gt;list:</span></span><br><span class=\"line\"> k=[l[<span class=\"number\">0</span>]]</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"keyword\">if</span> l[<span class=\"number\">1</span>:]:</span><br><span class=\"line\"> b=a(l[<span class=\"number\">1</span>:])</span><br><span class=\"line\"> b.extend(k)</span><br><span class=\"line\"> <span class=\"keyword\">else</span>:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> [l[<span class=\"number\">0</span>]]</span><br><span class=\"line\"> <span class=\"keyword\">return</span> b</span><br></pre></td></tr></table></figure>\n","site":{"data":{}},"excerpt":"<h3 id=\"206-__u53CD_u8F6C_u94FE_u8868\"><a href=\"#206-__u53CD_u8F6C_u94FE_u8868\" class=\"headerlink\" title=\"206. 反转链表\"></a>206. 反转链表</h3><p><a href=\"https://leetcode-cn.com/problems/reverse-linked-list/\" target=\"_blank\" rel=\"noopener\">题目</a></p>","more":"<p>最简单的思路是遍历链表一个列表去做存储,通过倒序读取列表的同时改写链表。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">ListNode</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">__init__</span><span class=\"params\">(self, x)</span>:</span></span><br><span class=\"line\"> self.val = x</span><br><span class=\"line\"> self.next = <span class=\"keyword\">None</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">reverseList</span><span class=\"params\">(self, head)</span>:</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> head <span class=\"keyword\">or</span> <span class=\"keyword\">not</span> head.next:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> head</span><br><span class=\"line\"> nl = []</span><br><span class=\"line\"> <span class=\"keyword\">while</span> head.next:</span><br><span class=\"line\"> nl.append(head)</span><br><span class=\"line\"> head = head.next</span><br><span class=\"line\"> nl.append(head)</span><br><span class=\"line\"> l = len(nl)</span><br><span class=\"line\"> <span class=\"keyword\">for</span> x <span class=\"keyword\">in</span> range(l):</span><br><span class=\"line\"> <span class=\"keyword\">if</span> x == <span class=\"number\">0</span>:</span><br><span class=\"line\"> nl[x].next = <span class=\"keyword\">None</span></span><br><span class=\"line\"> <span class=\"keyword\">continue</span></span><br><span class=\"line\"> nl[x].next = nl[x<span class=\"number\">-1</span>]</span><br><span class=\"line\"> <span class=\"keyword\">if</span> x == (l - <span class=\"number\">1</span>):</span><br><span class=\"line\"> <span class=\"keyword\">return</span> nl[x]</span><br></pre></td></tr></table></figure>\n<p>仔细想想自己又傻逼了,何必要遍历两次呢,在第一遍遍历的同时就能操作了:</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">reverseList</span><span class=\"params\">(self, head)</span>:</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> head <span class=\"keyword\">or</span> <span class=\"keyword\">not</span> head.next:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> head</span><br><span class=\"line\"> prev_node = <span class=\"keyword\">None</span></span><br><span class=\"line\"> next_node = head.next</span><br><span class=\"line\"> <span class=\"keyword\">while</span> head:</span><br><span class=\"line\"> next_node = head.next</span><br><span class=\"line\"> head.next = prev_node</span><br><span class=\"line\"> prev_node = head</span><br><span class=\"line\"> head = next_node</span><br><span class=\"line\"> <span class=\"keyword\">return</span> prev_node</span><br></pre></td></tr></table></figure>\n<p>然后是递归的做法,主要思路是一直进到最深一层–也就是链表的最后一个–的时候开始返回,同时修改那一层的两个 node。一开始踩了一个坑是返回了每一个node结果最后回到第一层的时候得到的是链表的末端其实只需要修改链表并不需要返回 node所以一开始到达链表末端的时候直接返回那一个node就可以了。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">reverseList</span><span class=\"params\">(self, head)</span>:</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> head:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> head</span><br><span class=\"line\"> <span class=\"keyword\">if</span> head.next:</span><br><span class=\"line\"> ss = Solution()</span><br><span class=\"line\"> last = ss.reverseList(head.next)</span><br><span class=\"line\"> head.next.next = head</span><br><span class=\"line\"> head.next = <span class=\"keyword\">None</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> last</span><br><span class=\"line\"> <span class=\"keyword\">return</span> head</span><br></pre></td></tr></table></figure>\n<p>一开始是用list来打草稿不过想明白递归之后就大同小异了</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">a</span><span class=\"params\">(l:list)</span>-&gt;list:</span></span><br><span class=\"line\"> k=[l[<span class=\"number\">0</span>]]</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"keyword\">if</span> l[<span class=\"number\">1</span>:]:</span><br><span class=\"line\"> b=a(l[<span class=\"number\">1</span>:])</span><br><span class=\"line\"> b.extend(k)</span><br><span class=\"line\"> <span class=\"keyword\">else</span>:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> [l[<span class=\"number\">0</span>]]</span><br><span class=\"line\"> <span class=\"keyword\">return</span> b</span><br></pre></td></tr></table></figure>"},{"title":"leetcode-225","date":"2020-03-23T15:35:05.000Z","_content":"\n### 225. 用队列实现栈\n\n[题目](https://leetcode-cn.com/problems/implement-stack-using-queues/)\n\n\n\n<!--more-->\n\n\n\n注意栈是 FILO(First In Last Out)Python 的 list 是 FIFO(First In First Out)。\n\n```python\nclass MyStack:\n\n def __init__(self):\n \"\"\"\n Initialize your data structure here.\n \"\"\"\n self.data = []\n\n\n def push(self, x: int) -> None:\n \"\"\"\n Push element x onto stack.\n \"\"\"\n self.data.append(x)\n return\n\n\n def pop(self) -> int:\n \"\"\"\n Removes the element on top of the stack and returns that element.\n \"\"\"\n return self.data.pop(-1)\n\n\n def top(self) -> int:\n \"\"\"\n Get the top element.\n \"\"\"\n return self.data[-1]\n\n\n def empty(self) -> bool:\n \"\"\"\n Returns whether the stack is empty.\n \"\"\"\n return not bool(self.data)\n\n\n\n# Your MyStack object will be instantiated and called as such:\n# obj = MyStack()\n# obj.push(x)\n# param_2 = obj.pop()\n# param_3 = obj.top()\n# param_4 = obj.empty()\n\n#24 ms\t13.5 MB\n```\n\n","source":"_posts/2020-03-23-leetcode-225.md","raw":"---\ntitle: leetcode-225\ndate: 2020-03-23 23:35:05\ntags:\ncategories: leetcode\n---\n\n### 225. 用队列实现栈\n\n[题目](https://leetcode-cn.com/problems/implement-stack-using-queues/)\n\n\n\n<!--more-->\n\n\n\n注意栈是 FILO(First In Last Out)Python 的 list 是 FIFO(First In First Out)。\n\n```python\nclass MyStack:\n\n def __init__(self):\n \"\"\"\n Initialize your data structure here.\n \"\"\"\n self.data = []\n\n\n def push(self, x: int) -> None:\n \"\"\"\n Push element x onto stack.\n \"\"\"\n self.data.append(x)\n return\n\n\n def pop(self) -> int:\n \"\"\"\n Removes the element on top of the stack and returns that element.\n \"\"\"\n return self.data.pop(-1)\n\n\n def top(self) -> int:\n \"\"\"\n Get the top element.\n \"\"\"\n return self.data[-1]\n\n\n def empty(self) -> bool:\n \"\"\"\n Returns whether the stack is empty.\n \"\"\"\n return not bool(self.data)\n\n\n\n# Your MyStack object will be instantiated and called as such:\n# obj = MyStack()\n# obj.push(x)\n# param_2 = obj.pop()\n# param_3 = obj.top()\n# param_4 = obj.empty()\n\n#24 ms\t13.5 MB\n```\n\n","slug":"leetcode-225","published":1,"updated":"2020-03-23T15:35:24.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4d0005subutkoz8ewr","content":"<h3 id=\"225-__u7528_u961F_u5217_u5B9E_u73B0_u6808\"><a href=\"#225-__u7528_u961F_u5217_u5B9E_u73B0_u6808\" class=\"headerlink\" title=\"225. 用队列实现栈\"></a>225. 用队列实现栈</h3><p><a href=\"https://leetcode-cn.com/problems/implement-stack-using-queues/\" target=\"_blank\" rel=\"noopener\">题目</a></p>\n<a id=\"more\"></a>\n<p>注意栈是 FILO(First In Last Out)Python 的 list 是 FIFO(First In First Out)。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br><span class=\"line\">42</span><br><span class=\"line\">43</span><br><span class=\"line\">44</span><br><span class=\"line\">45</span><br><span class=\"line\">46</span><br><span class=\"line\">47</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">MyStack</span>:</span></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">__init__</span><span class=\"params\">(self)</span>:</span></span><br><span class=\"line\"> <span class=\"string\">\"\"\"</span></span><br><span class=\"line\"><span class=\"string\"> Initialize your data structure here.</span></span><br><span class=\"line\"><span class=\"string\"> \"\"\"</span></span><br><span class=\"line\"> self.data = []</span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">push</span><span class=\"params\">(self, x: int)</span> -&gt; <span class=\"keyword\">None</span>:</span></span><br><span class=\"line\"> <span class=\"string\">\"\"\"</span></span><br><span class=\"line\"><span class=\"string\"> Push element x onto stack.</span></span><br><span class=\"line\"><span class=\"string\"> \"\"\"</span></span><br><span class=\"line\"> self.data.append(x)</span><br><span class=\"line\"> <span class=\"keyword\">return</span></span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">pop</span><span class=\"params\">(self)</span> -&gt; int:</span></span><br><span class=\"line\"> <span class=\"string\">\"\"\"</span></span><br><span class=\"line\"><span class=\"string\"> Removes the element on top of the stack and returns that element.</span></span><br><span class=\"line\"><span class=\"string\"> \"\"\"</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> self.data.pop(<span class=\"number\">-1</span>)</span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">top</span><span class=\"params\">(self)</span> -&gt; int:</span></span><br><span class=\"line\"> <span class=\"string\">\"\"\"</span></span><br><span class=\"line\"><span class=\"string\"> Get the top element.</span></span><br><span class=\"line\"><span class=\"string\"> \"\"\"</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> self.data[<span class=\"number\">-1</span>]</span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">empty</span><span class=\"params\">(self)</span> -&gt; bool:</span></span><br><span class=\"line\"> <span class=\"string\">\"\"\"</span></span><br><span class=\"line\"><span class=\"string\"> Returns whether the stack is empty.</span></span><br><span class=\"line\"><span class=\"string\"> \"\"\"</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"keyword\">not</span> bool(self.data)</span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\"># Your MyStack object will be instantiated and called as such:</span></span><br><span class=\"line\"><span class=\"comment\"># obj = MyStack()</span></span><br><span class=\"line\"><span class=\"comment\"># obj.push(x)</span></span><br><span class=\"line\"><span class=\"comment\"># param_2 = obj.pop()</span></span><br><span class=\"line\"><span class=\"comment\"># param_3 = obj.top()</span></span><br><span class=\"line\"><span class=\"comment\"># param_4 = obj.empty()</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\">#24 ms\t13.5 MB</span></span><br></pre></td></tr></table></figure>\n","site":{"data":{}},"excerpt":"<h3 id=\"225-__u7528_u961F_u5217_u5B9E_u73B0_u6808\"><a href=\"#225-__u7528_u961F_u5217_u5B9E_u73B0_u6808\" class=\"headerlink\" title=\"225. 用队列实现栈\"></a>225. 用队列实现栈</h3><p><a href=\"https://leetcode-cn.com/problems/implement-stack-using-queues/\" target=\"_blank\" rel=\"noopener\">题目</a></p>","more":"<p>注意栈是 FILO(First In Last Out)Python 的 list 是 FIFO(First In First Out)。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br><span class=\"line\">42</span><br><span class=\"line\">43</span><br><span class=\"line\">44</span><br><span class=\"line\">45</span><br><span class=\"line\">46</span><br><span class=\"line\">47</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">MyStack</span>:</span></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">__init__</span><span class=\"params\">(self)</span>:</span></span><br><span class=\"line\"> <span class=\"string\">\"\"\"</span></span><br><span class=\"line\"><span class=\"string\"> Initialize your data structure here.</span></span><br><span class=\"line\"><span class=\"string\"> \"\"\"</span></span><br><span class=\"line\"> self.data = []</span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">push</span><span class=\"params\">(self, x: int)</span> -&gt; <span class=\"keyword\">None</span>:</span></span><br><span class=\"line\"> <span class=\"string\">\"\"\"</span></span><br><span class=\"line\"><span class=\"string\"> Push element x onto stack.</span></span><br><span class=\"line\"><span class=\"string\"> \"\"\"</span></span><br><span class=\"line\"> self.data.append(x)</span><br><span class=\"line\"> <span class=\"keyword\">return</span></span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">pop</span><span class=\"params\">(self)</span> -&gt; int:</span></span><br><span class=\"line\"> <span class=\"string\">\"\"\"</span></span><br><span class=\"line\"><span class=\"string\"> Removes the element on top of the stack and returns that element.</span></span><br><span class=\"line\"><span class=\"string\"> \"\"\"</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> self.data.pop(<span class=\"number\">-1</span>)</span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">top</span><span class=\"params\">(self)</span> -&gt; int:</span></span><br><span class=\"line\"> <span class=\"string\">\"\"\"</span></span><br><span class=\"line\"><span class=\"string\"> Get the top element.</span></span><br><span class=\"line\"><span class=\"string\"> \"\"\"</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> self.data[<span class=\"number\">-1</span>]</span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">empty</span><span class=\"params\">(self)</span> -&gt; bool:</span></span><br><span class=\"line\"> <span class=\"string\">\"\"\"</span></span><br><span class=\"line\"><span class=\"string\"> Returns whether the stack is empty.</span></span><br><span class=\"line\"><span class=\"string\"> \"\"\"</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"keyword\">not</span> bool(self.data)</span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\"># Your MyStack object will be instantiated and called as such:</span></span><br><span class=\"line\"><span class=\"comment\"># obj = MyStack()</span></span><br><span class=\"line\"><span class=\"comment\"># obj.push(x)</span></span><br><span class=\"line\"><span class=\"comment\"># param_2 = obj.pop()</span></span><br><span class=\"line\"><span class=\"comment\"># param_3 = obj.top()</span></span><br><span class=\"line\"><span class=\"comment\"># param_4 = obj.empty()</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\">#24 ms\t13.5 MB</span></span><br></pre></td></tr></table></figure>"},{"title":"leetcode-169","date":"2020-03-23T15:12:57.000Z","_content":"\n\n### 169. 多数元素\n\n[题目](https://leetcode-cn.com/problems/majority-element/)\n\n\n\n<!--more-->\n\n\n\n一开始的思路是遍历一遍整个列表用一个字典去记录每个元素出现的次数当次数大于 $\\cfrac{n}{2}$ 时就可以得出结果。\n\n```python\nclass Solution:\n def majorityElement(self, nums) -> int:\n d = {}\n l = len(nums)\n for n in nums:\n if not n in d:\n d[n] = 0\n d[n] = d[n] + 1\n if d[n] > l/2:\n return n\n# 64 ms\t15.1 MB\n```\n\nPython 也有专门计数的库,写起来更简单一点:\n\n```python\nclass Solution:\n def majorityElement(self, nums):\n counts = collections.Counter(nums)\n return max(counts.keys(), key=counts.get)\n# 44 ms\t15.1 MB\n```\n\n由于要找的数出现次数大于 $\\cfrac{n}{2}$,脑子里掠过一下[蒙特卡罗算法](https://zh.wikipedia.org/wiki/%E8%92%99%E5%9C%B0%E5%8D%A1%E7%BE%85%E6%96%B9%E6%B3%95),后来在官方解答中也看到类似的思路了:\n\n```python\nclass Solution:\n def majorityElement(self, nums):\n majority_count = len(nums)//2\n while True:\n candidate = random.choice(nums)\n if sum(1 for elem in nums if elem == candidate) > majority_count:\n return candidate\n\n#作者LeetCode-Solution\n#链接https://leetcode-cn.com/problems/majority-element/solution/duo-shu-yuan-su-by-leetcode-solution/\n#来源力扣LeetCode\n#著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\n```\n\n\n","source":"_posts/2020-03-23-leetcode-169.md","raw":"---\ntitle: leetcode-169\ndate: 2020-03-23 23:12:57\ntags:\ncategories: leetcode\n---\n\n\n### 169. 多数元素\n\n[题目](https://leetcode-cn.com/problems/majority-element/)\n\n\n\n<!--more-->\n\n\n\n一开始的思路是遍历一遍整个列表用一个字典去记录每个元素出现的次数当次数大于 $\\cfrac{n}{2}$ 时就可以得出结果。\n\n```python\nclass Solution:\n def majorityElement(self, nums) -> int:\n d = {}\n l = len(nums)\n for n in nums:\n if not n in d:\n d[n] = 0\n d[n] = d[n] + 1\n if d[n] > l/2:\n return n\n# 64 ms\t15.1 MB\n```\n\nPython 也有专门计数的库,写起来更简单一点:\n\n```python\nclass Solution:\n def majorityElement(self, nums):\n counts = collections.Counter(nums)\n return max(counts.keys(), key=counts.get)\n# 44 ms\t15.1 MB\n```\n\n由于要找的数出现次数大于 $\\cfrac{n}{2}$,脑子里掠过一下[蒙特卡罗算法](https://zh.wikipedia.org/wiki/%E8%92%99%E5%9C%B0%E5%8D%A1%E7%BE%85%E6%96%B9%E6%B3%95),后来在官方解答中也看到类似的思路了:\n\n```python\nclass Solution:\n def majorityElement(self, nums):\n majority_count = len(nums)//2\n while True:\n candidate = random.choice(nums)\n if sum(1 for elem in nums if elem == candidate) > majority_count:\n return candidate\n\n#作者LeetCode-Solution\n#链接https://leetcode-cn.com/problems/majority-element/solution/duo-shu-yuan-su-by-leetcode-solution/\n#来源力扣LeetCode\n#著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\n```\n\n\n","slug":"leetcode-169","published":1,"updated":"2020-03-23T15:13:49.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4e0006subugxejhq3n","content":"<h3 id=\"169-__u591A_u6570_u5143_u7D20\"><a href=\"#169-__u591A_u6570_u5143_u7D20\" class=\"headerlink\" title=\"169. 多数元素\"></a>169. 多数元素</h3><p><a href=\"https://leetcode-cn.com/problems/majority-element/\" target=\"_blank\" rel=\"noopener\">题目</a></p>\n<a id=\"more\"></a>\n<p>一开始的思路是遍历一遍整个列表,用一个字典去记录每个元素出现的次数,当次数大于 $\\cfrac{n}{2}$ 时就可以得出结果。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">majorityElement</span><span class=\"params\">(self, nums)</span> -&gt; int:</span></span><br><span class=\"line\"> d = &#123;&#125;</span><br><span class=\"line\"> l = len(nums)</span><br><span class=\"line\"> <span class=\"keyword\">for</span> n <span class=\"keyword\">in</span> nums:</span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> n <span class=\"keyword\">in</span> d:</span><br><span class=\"line\"> d[n] = <span class=\"number\">0</span></span><br><span class=\"line\"> d[n] = d[n] + <span class=\"number\">1</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> d[n] &gt; l/<span class=\"number\">2</span>:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> n</span><br><span class=\"line\"><span class=\"comment\"># 64 ms\t15.1 MB</span></span><br></pre></td></tr></table></figure>\n<p>Python 也有专门计数的库,写起来更简单一点:</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">majorityElement</span><span class=\"params\">(self, nums)</span>:</span></span><br><span class=\"line\"> counts = collections.Counter(nums)</span><br><span class=\"line\"> <span class=\"keyword\">return</span> max(counts.keys(), key=counts.get)</span><br><span class=\"line\"><span class=\"comment\"># 44 ms\t15.1 MB</span></span><br></pre></td></tr></table></figure>\n<p>由于要找的数出现次数大于 $\\cfrac{n}{2}$,脑子里掠过一下<a href=\"https://zh.wikipedia.org/wiki/%E8%92%99%E5%9C%B0%E5%8D%A1%E7%BE%85%E6%96%B9%E6%B3%95\" target=\"_blank\" rel=\"noopener\">蒙特卡罗算法</a>,后来在官方解答中也看到类似的思路了:</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">majorityElement</span><span class=\"params\">(self, nums)</span>:</span></span><br><span class=\"line\"> majority_count = len(nums)//<span class=\"number\">2</span></span><br><span class=\"line\"> <span class=\"keyword\">while</span> <span class=\"keyword\">True</span>:</span><br><span class=\"line\"> candidate = random.choice(nums)</span><br><span class=\"line\"> <span class=\"keyword\">if</span> sum(<span class=\"number\">1</span> <span class=\"keyword\">for</span> elem <span class=\"keyword\">in</span> nums <span class=\"keyword\">if</span> elem == candidate) &gt; majority_count:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> candidate</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\">#作者LeetCode-Solution</span></span><br><span class=\"line\"><span class=\"comment\">#链接https://leetcode-cn.com/problems/majority-element/solution/duo-shu-yuan-su-by-leetcode-solution/</span></span><br><span class=\"line\"><span class=\"comment\">#来源力扣LeetCode</span></span><br><span class=\"line\"><span class=\"comment\">#著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</span></span><br></pre></td></tr></table></figure>\n","site":{"data":{}},"excerpt":"<h3 id=\"169-__u591A_u6570_u5143_u7D20\"><a href=\"#169-__u591A_u6570_u5143_u7D20\" class=\"headerlink\" title=\"169. 多数元素\"></a>169. 多数元素</h3><p><a href=\"https://leetcode-cn.com/problems/majority-element/\" target=\"_blank\" rel=\"noopener\">题目</a></p>","more":"<p>一开始的思路是遍历一遍整个列表,用一个字典去记录每个元素出现的次数,当次数大于 $\\cfrac{n}{2}$ 时就可以得出结果。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">majorityElement</span><span class=\"params\">(self, nums)</span> -&gt; int:</span></span><br><span class=\"line\"> d = &#123;&#125;</span><br><span class=\"line\"> l = len(nums)</span><br><span class=\"line\"> <span class=\"keyword\">for</span> n <span class=\"keyword\">in</span> nums:</span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> n <span class=\"keyword\">in</span> d:</span><br><span class=\"line\"> d[n] = <span class=\"number\">0</span></span><br><span class=\"line\"> d[n] = d[n] + <span class=\"number\">1</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> d[n] &gt; l/<span class=\"number\">2</span>:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> n</span><br><span class=\"line\"><span class=\"comment\"># 64 ms\t15.1 MB</span></span><br></pre></td></tr></table></figure>\n<p>Python 也有专门计数的库,写起来更简单一点:</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">majorityElement</span><span class=\"params\">(self, nums)</span>:</span></span><br><span class=\"line\"> counts = collections.Counter(nums)</span><br><span class=\"line\"> <span class=\"keyword\">return</span> max(counts.keys(), key=counts.get)</span><br><span class=\"line\"><span class=\"comment\"># 44 ms\t15.1 MB</span></span><br></pre></td></tr></table></figure>\n<p>由于要找的数出现次数大于 $\\cfrac{n}{2}$,脑子里掠过一下<a href=\"https://zh.wikipedia.org/wiki/%E8%92%99%E5%9C%B0%E5%8D%A1%E7%BE%85%E6%96%B9%E6%B3%95\" target=\"_blank\" rel=\"noopener\">蒙特卡罗算法</a>,后来在官方解答中也看到类似的思路了:</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">majorityElement</span><span class=\"params\">(self, nums)</span>:</span></span><br><span class=\"line\"> majority_count = len(nums)//<span class=\"number\">2</span></span><br><span class=\"line\"> <span class=\"keyword\">while</span> <span class=\"keyword\">True</span>:</span><br><span class=\"line\"> candidate = random.choice(nums)</span><br><span class=\"line\"> <span class=\"keyword\">if</span> sum(<span class=\"number\">1</span> <span class=\"keyword\">for</span> elem <span class=\"keyword\">in</span> nums <span class=\"keyword\">if</span> elem == candidate) &gt; majority_count:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> candidate</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\">#作者LeetCode-Solution</span></span><br><span class=\"line\"><span class=\"comment\">#链接https://leetcode-cn.com/problems/majority-element/solution/duo-shu-yuan-su-by-leetcode-solution/</span></span><br><span class=\"line\"><span class=\"comment\">#来源力扣LeetCode</span></span><br><span class=\"line\"><span class=\"comment\">#著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</span></span><br></pre></td></tr></table></figure>"},{"title":"leetcode-409","date":"2020-03-25T13:55:38.000Z","_content":"\n### 409. 最长回文串\n\n[题目](https://leetcode-cn.com/problems/longest-palindrome/)\n\n\n\n<!--more-->\n\n\n\n\n\n一开始理解错题目了以为是寻找字符串中的最长回文串结果是构造。但是原理基本一样由于回文中心对称所以是由多个偶数个相同字母和至多一个奇数个相同字母组成。\n\n这样只要数给出的字符串中有几个偶数个相同字母和几个奇数个相同字母就可以了。奇数个相同字母可以减少一个当偶数个用最后再加回去一个。\n\n\n\n```python\nclass Solution:\n def longestPalindrome(self, s: str) -> int:\n d = {}\n for l in s:\n if not l in d:\n d[l] = 0\n d[l] += 1\n\n i = 0\n odd = False\n for k, v in d.items():\n if v % 2:\n i += (v-1)\n odd = True\n else:\n i += v\n if odd:\n i += 1\n return i\n\n#40 ms\t13.6 MB\n```\n\n","source":"_posts/2020-03-25-leetcode-409.md","raw":"---\ntitle: leetcode-409\ndate: 2020-03-25 21:55:38\ntags:\ncategories: leetcode\n---\n\n### 409. 最长回文串\n\n[题目](https://leetcode-cn.com/problems/longest-palindrome/)\n\n\n\n<!--more-->\n\n\n\n\n\n一开始理解错题目了以为是寻找字符串中的最长回文串结果是构造。但是原理基本一样由于回文中心对称所以是由多个偶数个相同字母和至多一个奇数个相同字母组成。\n\n这样只要数给出的字符串中有几个偶数个相同字母和几个奇数个相同字母就可以了。奇数个相同字母可以减少一个当偶数个用最后再加回去一个。\n\n\n\n```python\nclass Solution:\n def longestPalindrome(self, s: str) -> int:\n d = {}\n for l in s:\n if not l in d:\n d[l] = 0\n d[l] += 1\n\n i = 0\n odd = False\n for k, v in d.items():\n if v % 2:\n i += (v-1)\n odd = True\n else:\n i += v\n if odd:\n i += 1\n return i\n\n#40 ms\t13.6 MB\n```\n\n","slug":"leetcode-409","published":1,"updated":"2020-03-25T13:55:54.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4f0007subugdeybnq7","content":"<h3 id=\"409-__u6700_u957F_u56DE_u6587_u4E32\"><a href=\"#409-__u6700_u957F_u56DE_u6587_u4E32\" class=\"headerlink\" title=\"409. 最长回文串\"></a>409. 最长回文串</h3><p><a href=\"https://leetcode-cn.com/problems/longest-palindrome/\" target=\"_blank\" rel=\"noopener\">题目</a></p>\n<a id=\"more\"></a>\n<p>一开始理解错题目了,以为是寻找字符串中的最长回文串,结果是构造。但是原理基本一样,由于回文中心对称,所以是由多个偶数个相同字母和至多一个奇数个相同字母组成。</p>\n<p>这样只要数给出的字符串中有几个偶数个相同字母和几个奇数个相同字母就可以了。奇数个相同字母可以减少一个当偶数个用,最后再加回去一个。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">longestPalindrome</span><span class=\"params\">(self, s: str)</span> -&gt; int:</span></span><br><span class=\"line\"> d = &#123;&#125;</span><br><span class=\"line\"> <span class=\"keyword\">for</span> l <span class=\"keyword\">in</span> s:</span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> l <span class=\"keyword\">in</span> d:</span><br><span class=\"line\"> d[l] = <span class=\"number\">0</span></span><br><span class=\"line\"> d[l] += <span class=\"number\">1</span></span><br><span class=\"line\"></span><br><span class=\"line\"> i = <span class=\"number\">0</span></span><br><span class=\"line\"> odd = <span class=\"keyword\">False</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> k, v <span class=\"keyword\">in</span> d.items():</span><br><span class=\"line\"> <span class=\"keyword\">if</span> v % <span class=\"number\">2</span>:</span><br><span class=\"line\"> i += (v<span class=\"number\">-1</span>)</span><br><span class=\"line\"> odd = <span class=\"keyword\">True</span></span><br><span class=\"line\"> <span class=\"keyword\">else</span>:</span><br><span class=\"line\"> i += v</span><br><span class=\"line\"> <span class=\"keyword\">if</span> odd:</span><br><span class=\"line\"> i += <span class=\"number\">1</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> i</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\">#40 ms\t13.6 MB</span></span><br></pre></td></tr></table></figure>\n","site":{"data":{}},"excerpt":"<h3 id=\"409-__u6700_u957F_u56DE_u6587_u4E32\"><a href=\"#409-__u6700_u957F_u56DE_u6587_u4E32\" class=\"headerlink\" title=\"409. 最长回文串\"></a>409. 最长回文串</h3><p><a href=\"https://leetcode-cn.com/problems/longest-palindrome/\" target=\"_blank\" rel=\"noopener\">题目</a></p>","more":"<p>一开始理解错题目了,以为是寻找字符串中的最长回文串,结果是构造。但是原理基本一样,由于回文中心对称,所以是由多个偶数个相同字母和至多一个奇数个相同字母组成。</p>\n<p>这样只要数给出的字符串中有几个偶数个相同字母和几个奇数个相同字母就可以了。奇数个相同字母可以减少一个当偶数个用,最后再加回去一个。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">longestPalindrome</span><span class=\"params\">(self, s: str)</span> -&gt; int:</span></span><br><span class=\"line\"> d = &#123;&#125;</span><br><span class=\"line\"> <span class=\"keyword\">for</span> l <span class=\"keyword\">in</span> s:</span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> l <span class=\"keyword\">in</span> d:</span><br><span class=\"line\"> d[l] = <span class=\"number\">0</span></span><br><span class=\"line\"> d[l] += <span class=\"number\">1</span></span><br><span class=\"line\"></span><br><span class=\"line\"> i = <span class=\"number\">0</span></span><br><span class=\"line\"> odd = <span class=\"keyword\">False</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> k, v <span class=\"keyword\">in</span> d.items():</span><br><span class=\"line\"> <span class=\"keyword\">if</span> v % <span class=\"number\">2</span>:</span><br><span class=\"line\"> i += (v<span class=\"number\">-1</span>)</span><br><span class=\"line\"> odd = <span class=\"keyword\">True</span></span><br><span class=\"line\"> <span class=\"keyword\">else</span>:</span><br><span class=\"line\"> i += v</span><br><span class=\"line\"> <span class=\"keyword\">if</span> odd:</span><br><span class=\"line\"> i += <span class=\"number\">1</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> i</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\">#40 ms\t13.6 MB</span></span><br></pre></td></tr></table></figure>"},{"title":"leetcode-543","date":"2020-03-25T11:13:52.000Z","_content":"\n### 543. 二叉树的直径\n\n\n[题目](https://leetcode-cn.com/problems/diameter-of-binary-tree/)\n\n\n<!--more-->\n\n\n\n这题做出来了但是没有通过运行时间的测试主要还是没想明白二叉树的直径到底是什么东西用了个蠢办法。\n\n```python\n# Definition for a binary tree node.\nclass TreeNode:\n def __init__(self, x):\n self.val = x\n self.left = None\n self.right = None\n\nclass Solution:\n def diameterOfBinaryTree(self, root: TreeNode) -> int:\n if not root:\n return 0\n last_node = -1\n routes = []\n start = root\n node_stack = [root]\n while (start.left or start.right or node_stack):\n if start != node_stack[-1]:\n node_stack.append(start)\n\n if last_node == start.right:\n node_stack = node_stack[:-1]\n if not node_stack:\n break\n last_node = start\n start = node_stack[-1]\n continue\n\n if start.left and last_node != start.left:\n start = start.left\n last_node = start\n continue\n\n if start.right:\n start = start.right\n last_node = start\n continue\n\n routes.append(node_stack)\n node_stack = node_stack[:-1]\n if not node_stack:\n break\n last_node = start\n start = node_stack[-1]\n\n max_l = 0\n for route in routes:\n for route_ in routes:\n intersection = 0\n if route != route_:\n intersection = len(set(route).intersection(set(route_)))\n if intersection:\n intersection -= 1\n max_l = max(max_l, len(set(route)| set(route_)) - intersection)\n return max_l - 1\n```\n\n\n\nL43 之前做的是以深度优先的方式遍历一遍树,得出每个点的路径。后面的是将所有路径组合在一起得出任意两个点间的路径,算出最大长度。\n\n\n\n其实以某个点为根节点的树的直径就是某个节点的**左子树的深度和右子树的深度的和**,用递归来处理这个会比较容易理解\n\n\n\n```python\nclass Solution(object):\n def diameterOfBinaryTree(self, root):\n self.ans = 1\n def depth(node):\n # 访问到空节点了返回0\n if not node: return 0\n # 左儿子为根的子树的深度\n L = depth(node.left)\n # 右儿子为根的子树的深度\n R = depth(node.right)\n # 计算d_node即L+R+1 并更新ans\n self.ans = max(self.ans, L+R+1)\n # 返回该节点为根的子树的深度\n return max(L, R) + 1\n\n depth(root)\n return self.ans - 1\n\n作者LeetCode-Solution\n链接https://leetcode-cn.com/problems/diameter-of-binary-tree/solution/er-cha-shu-de-zhi-jing-by-leetcode-solution/\n来源力扣LeetCode\n著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。\n```\n\n\n","source":"_posts/2020-03-25-leetcode-543.md","raw":"---\ntitle: leetcode-543\ndate: 2020-03-25 19:13:52\ntags:\ncategories: leetcode\n---\n\n### 543. 二叉树的直径\n\n\n[题目](https://leetcode-cn.com/problems/diameter-of-binary-tree/)\n\n\n<!--more-->\n\n\n\n这题做出来了但是没有通过运行时间的测试主要还是没想明白二叉树的直径到底是什么东西用了个蠢办法。\n\n```python\n# Definition for a binary tree node.\nclass TreeNode:\n def __init__(self, x):\n self.val = x\n self.left = None\n self.right = None\n\nclass Solution:\n def diameterOfBinaryTree(self, root: TreeNode) -> int:\n if not root:\n return 0\n last_node = -1\n routes = []\n start = root\n node_stack = [root]\n while (start.left or start.right or node_stack):\n if start != node_stack[-1]:\n node_stack.append(start)\n\n if last_node == start.right:\n node_stack = node_stack[:-1]\n if not node_stack:\n break\n last_node = start\n start = node_stack[-1]\n continue\n\n if start.left and last_node != start.left:\n start = start.left\n last_node = start\n continue\n\n if start.right:\n start = start.right\n last_node = start\n continue\n\n routes.append(node_stack)\n node_stack = node_stack[:-1]\n if not node_stack:\n break\n last_node = start\n start = node_stack[-1]\n\n max_l = 0\n for route in routes:\n for route_ in routes:\n intersection = 0\n if route != route_:\n intersection = len(set(route).intersection(set(route_)))\n if intersection:\n intersection -= 1\n max_l = max(max_l, len(set(route)| set(route_)) - intersection)\n return max_l - 1\n```\n\n\n\nL43 之前做的是以深度优先的方式遍历一遍树,得出每个点的路径。后面的是将所有路径组合在一起得出任意两个点间的路径,算出最大长度。\n\n\n\n其实以某个点为根节点的树的直径就是某个节点的**左子树的深度和右子树的深度的和**,用递归来处理这个会比较容易理解\n\n\n\n```python\nclass Solution(object):\n def diameterOfBinaryTree(self, root):\n self.ans = 1\n def depth(node):\n # 访问到空节点了返回0\n if not node: return 0\n # 左儿子为根的子树的深度\n L = depth(node.left)\n # 右儿子为根的子树的深度\n R = depth(node.right)\n # 计算d_node即L+R+1 并更新ans\n self.ans = max(self.ans, L+R+1)\n # 返回该节点为根的子树的深度\n return max(L, R) + 1\n\n depth(root)\n return self.ans - 1\n\n作者LeetCode-Solution\n链接https://leetcode-cn.com/problems/diameter-of-binary-tree/solution/er-cha-shu-de-zhi-jing-by-leetcode-solution/\n来源力扣LeetCode\n著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。\n```\n\n\n","slug":"leetcode-543","published":1,"updated":"2020-04-14T15:29:53.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4g0009subu00ew2ar1","content":"<h3 id=\"543-__u4E8C_u53C9_u6811_u7684_u76F4_u5F84\"><a href=\"#543-__u4E8C_u53C9_u6811_u7684_u76F4_u5F84\" class=\"headerlink\" title=\"543. 二叉树的直径\"></a>543. 二叉树的直径</h3><p><a href=\"https://leetcode-cn.com/problems/diameter-of-binary-tree/\" target=\"_blank\" rel=\"noopener\">题目</a></p>\n<a id=\"more\"></a>\n<p>这题做出来了但是没有通过运行时间的测试,主要还是没想明白二叉树的直径到底是什么东西,用了个蠢办法。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br><span class=\"line\">42</span><br><span class=\"line\">43</span><br><span class=\"line\">44</span><br><span class=\"line\">45</span><br><span class=\"line\">46</span><br><span class=\"line\">47</span><br><span class=\"line\">48</span><br><span class=\"line\">49</span><br><span class=\"line\">50</span><br><span class=\"line\">51</span><br><span class=\"line\">52</span><br><span class=\"line\">53</span><br><span class=\"line\">54</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\"># Definition for a binary tree node.</span></span><br><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">TreeNode</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">__init__</span><span class=\"params\">(self, x)</span>:</span></span><br><span class=\"line\"> self.val = x</span><br><span class=\"line\"> self.left = <span class=\"keyword\">None</span></span><br><span class=\"line\"> self.right = <span class=\"keyword\">None</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">diameterOfBinaryTree</span><span class=\"params\">(self, root: TreeNode)</span> -&gt; int:</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> root:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"number\">0</span></span><br><span class=\"line\"> last_node = <span class=\"number\">-1</span></span><br><span class=\"line\"> routes = []</span><br><span class=\"line\"> start = root</span><br><span class=\"line\"> node_stack = [root]</span><br><span class=\"line\"> <span class=\"keyword\">while</span> (start.left <span class=\"keyword\">or</span> start.right <span class=\"keyword\">or</span> node_stack):</span><br><span class=\"line\"> <span class=\"keyword\">if</span> start != node_stack[<span class=\"number\">-1</span>]:</span><br><span class=\"line\"> node_stack.append(start)</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"keyword\">if</span> last_node == start.right:</span><br><span class=\"line\"> node_stack = node_stack[:<span class=\"number\">-1</span>]</span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> node_stack:</span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"> last_node = start</span><br><span class=\"line\"> start = node_stack[<span class=\"number\">-1</span>]</span><br><span class=\"line\"> <span class=\"keyword\">continue</span></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"keyword\">if</span> start.left <span class=\"keyword\">and</span> last_node != start.left:</span><br><span class=\"line\"> start = start.left</span><br><span class=\"line\"> last_node = start</span><br><span class=\"line\"> <span class=\"keyword\">continue</span></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"keyword\">if</span> start.right:</span><br><span class=\"line\"> start = start.right</span><br><span class=\"line\"> last_node = start</span><br><span class=\"line\"> <span class=\"keyword\">continue</span></span><br><span class=\"line\"></span><br><span class=\"line\"> routes.append(node_stack)</span><br><span class=\"line\"> node_stack = node_stack[:<span class=\"number\">-1</span>]</span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> node_stack:</span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"> last_node = start</span><br><span class=\"line\"> start = node_stack[<span class=\"number\">-1</span>]</span><br><span class=\"line\"></span><br><span class=\"line\"> max_l = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> route <span class=\"keyword\">in</span> routes:</span><br><span class=\"line\"> <span class=\"keyword\">for</span> route_ <span class=\"keyword\">in</span> routes:</span><br><span class=\"line\"> intersection = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> route != route_:</span><br><span class=\"line\"> intersection = len(set(route).intersection(set(route_)))</span><br><span class=\"line\"> <span class=\"keyword\">if</span> intersection:</span><br><span class=\"line\"> intersection -= <span class=\"number\">1</span></span><br><span class=\"line\"> max_l = max(max_l, len(set(route)| set(route_)) - intersection)</span><br><span class=\"line\"> <span class=\"keyword\">return</span> max_l - <span class=\"number\">1</span></span><br></pre></td></tr></table></figure>\n<p>L43 之前做的是以深度优先的方式遍历一遍树,得出每个点的路径。后面的是将所有路径组合在一起得出任意两个点间的路径,算出最大长度。</p>\n<p>其实以某个点为根节点的树的直径,就是某个节点的<strong>左子树的深度和右子树的深度的和</strong>,用递归来处理这个会比较容易理解</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span><span class=\"params\">(object)</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">diameterOfBinaryTree</span><span class=\"params\">(self, root)</span>:</span></span><br><span class=\"line\"> self.ans = <span class=\"number\">1</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">depth</span><span class=\"params\">(node)</span>:</span></span><br><span class=\"line\"> <span class=\"comment\"># 访问到空节点了返回0</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> node: <span class=\"keyword\">return</span> <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"comment\"># 左儿子为根的子树的深度</span></span><br><span class=\"line\"> L = depth(node.left)</span><br><span class=\"line\"> <span class=\"comment\"># 右儿子为根的子树的深度</span></span><br><span class=\"line\"> R = depth(node.right)</span><br><span class=\"line\"> <span class=\"comment\"># 计算d_node即L+R+1 并更新ans</span></span><br><span class=\"line\"> self.ans = max(self.ans, L+R+<span class=\"number\">1</span>)</span><br><span class=\"line\"> <span class=\"comment\"># 返回该节点为根的子树的深度</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> max(L, R) + <span class=\"number\">1</span></span><br><span class=\"line\"></span><br><span class=\"line\"> depth(root)</span><br><span class=\"line\"> <span class=\"keyword\">return</span> self.ans - <span class=\"number\">1</span></span><br><span class=\"line\"></span><br><span class=\"line\">作者LeetCode-Solution</span><br><span class=\"line\">链接https://leetcode-cn.com/problems/diameter-of-binary-tree/solution/er-cha-shu-de-zhi-jing-by-leetcode-solution/</span><br><span class=\"line\">来源力扣LeetCode</span><br><span class=\"line\">著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</span><br></pre></td></tr></table></figure>\n","site":{"data":{}},"excerpt":"<h3 id=\"543-__u4E8C_u53C9_u6811_u7684_u76F4_u5F84\"><a href=\"#543-__u4E8C_u53C9_u6811_u7684_u76F4_u5F84\" class=\"headerlink\" title=\"543. 二叉树的直径\"></a>543. 二叉树的直径</h3><p><a href=\"https://leetcode-cn.com/problems/diameter-of-binary-tree/\" target=\"_blank\" rel=\"noopener\">题目</a></p>","more":"<p>这题做出来了但是没有通过运行时间的测试,主要还是没想明白二叉树的直径到底是什么东西,用了个蠢办法。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br><span class=\"line\">42</span><br><span class=\"line\">43</span><br><span class=\"line\">44</span><br><span class=\"line\">45</span><br><span class=\"line\">46</span><br><span class=\"line\">47</span><br><span class=\"line\">48</span><br><span class=\"line\">49</span><br><span class=\"line\">50</span><br><span class=\"line\">51</span><br><span class=\"line\">52</span><br><span class=\"line\">53</span><br><span class=\"line\">54</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\"># Definition for a binary tree node.</span></span><br><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">TreeNode</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">__init__</span><span class=\"params\">(self, x)</span>:</span></span><br><span class=\"line\"> self.val = x</span><br><span class=\"line\"> self.left = <span class=\"keyword\">None</span></span><br><span class=\"line\"> self.right = <span class=\"keyword\">None</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">diameterOfBinaryTree</span><span class=\"params\">(self, root: TreeNode)</span> -&gt; int:</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> root:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"number\">0</span></span><br><span class=\"line\"> last_node = <span class=\"number\">-1</span></span><br><span class=\"line\"> routes = []</span><br><span class=\"line\"> start = root</span><br><span class=\"line\"> node_stack = [root]</span><br><span class=\"line\"> <span class=\"keyword\">while</span> (start.left <span class=\"keyword\">or</span> start.right <span class=\"keyword\">or</span> node_stack):</span><br><span class=\"line\"> <span class=\"keyword\">if</span> start != node_stack[<span class=\"number\">-1</span>]:</span><br><span class=\"line\"> node_stack.append(start)</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"keyword\">if</span> last_node == start.right:</span><br><span class=\"line\"> node_stack = node_stack[:<span class=\"number\">-1</span>]</span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> node_stack:</span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"> last_node = start</span><br><span class=\"line\"> start = node_stack[<span class=\"number\">-1</span>]</span><br><span class=\"line\"> <span class=\"keyword\">continue</span></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"keyword\">if</span> start.left <span class=\"keyword\">and</span> last_node != start.left:</span><br><span class=\"line\"> start = start.left</span><br><span class=\"line\"> last_node = start</span><br><span class=\"line\"> <span class=\"keyword\">continue</span></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"keyword\">if</span> start.right:</span><br><span class=\"line\"> start = start.right</span><br><span class=\"line\"> last_node = start</span><br><span class=\"line\"> <span class=\"keyword\">continue</span></span><br><span class=\"line\"></span><br><span class=\"line\"> routes.append(node_stack)</span><br><span class=\"line\"> node_stack = node_stack[:<span class=\"number\">-1</span>]</span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> node_stack:</span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"> last_node = start</span><br><span class=\"line\"> start = node_stack[<span class=\"number\">-1</span>]</span><br><span class=\"line\"></span><br><span class=\"line\"> max_l = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> route <span class=\"keyword\">in</span> routes:</span><br><span class=\"line\"> <span class=\"keyword\">for</span> route_ <span class=\"keyword\">in</span> routes:</span><br><span class=\"line\"> intersection = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> route != route_:</span><br><span class=\"line\"> intersection = len(set(route).intersection(set(route_)))</span><br><span class=\"line\"> <span class=\"keyword\">if</span> intersection:</span><br><span class=\"line\"> intersection -= <span class=\"number\">1</span></span><br><span class=\"line\"> max_l = max(max_l, len(set(route)| set(route_)) - intersection)</span><br><span class=\"line\"> <span class=\"keyword\">return</span> max_l - <span class=\"number\">1</span></span><br></pre></td></tr></table></figure>\n<p>L43 之前做的是以深度优先的方式遍历一遍树,得出每个点的路径。后面的是将所有路径组合在一起得出任意两个点间的路径,算出最大长度。</p>\n<p>其实以某个点为根节点的树的直径,就是某个节点的<strong>左子树的深度和右子树的深度的和</strong>,用递归来处理这个会比较容易理解</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span><span class=\"params\">(object)</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">diameterOfBinaryTree</span><span class=\"params\">(self, root)</span>:</span></span><br><span class=\"line\"> self.ans = <span class=\"number\">1</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">depth</span><span class=\"params\">(node)</span>:</span></span><br><span class=\"line\"> <span class=\"comment\"># 访问到空节点了返回0</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> node: <span class=\"keyword\">return</span> <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"comment\"># 左儿子为根的子树的深度</span></span><br><span class=\"line\"> L = depth(node.left)</span><br><span class=\"line\"> <span class=\"comment\"># 右儿子为根的子树的深度</span></span><br><span class=\"line\"> R = depth(node.right)</span><br><span class=\"line\"> <span class=\"comment\"># 计算d_node即L+R+1 并更新ans</span></span><br><span class=\"line\"> self.ans = max(self.ans, L+R+<span class=\"number\">1</span>)</span><br><span class=\"line\"> <span class=\"comment\"># 返回该节点为根的子树的深度</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> max(L, R) + <span class=\"number\">1</span></span><br><span class=\"line\"></span><br><span class=\"line\"> depth(root)</span><br><span class=\"line\"> <span class=\"keyword\">return</span> self.ans - <span class=\"number\">1</span></span><br><span class=\"line\"></span><br><span class=\"line\">作者LeetCode-Solution</span><br><span class=\"line\">链接https://leetcode-cn.com/problems/diameter-of-binary-tree/solution/er-cha-shu-de-zhi-jing-by-leetcode-solution/</span><br><span class=\"line\">来源力扣LeetCode</span><br><span class=\"line\">著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</span><br></pre></td></tr></table></figure>"},{"title":"leetcode-836","date":"2020-03-25T14:41:25.000Z","_content":"\n### 836. 矩形重叠\n\n[题目](https://leetcode-cn.com/problems/rectangle-overlap/)\n\n\n\n<!--more-->\n\n\n\n看两个矩形有没有重叠就看两个矩形在坐标轴上的投影有没有重叠。\n\n\n\n```python\nclass Solution:\n def isRectangleOverlap(self, rec1, rec2) -> bool:\n return ((min(rec1[2], rec2[2]) > max(rec1[0], rec2[0]))\n and (min(rec1[3], rec2[3]) > max(rec1[1], rec2[1])))\n\ns = Solution()\ns.isRectangleOverlap(rec1 = [0,0,2,2], rec2 = [1,1,3,3])\n\n#40 ms\t13.7 MB\n```\n\n","source":"_posts/2020-03-25-leetcode-836.md","raw":"---\ntitle: leetcode-836\ndate: 2020-03-25 22:41:25\ntags:\ncategories: leetcode\n---\n\n### 836. 矩形重叠\n\n[题目](https://leetcode-cn.com/problems/rectangle-overlap/)\n\n\n\n<!--more-->\n\n\n\n看两个矩形有没有重叠就看两个矩形在坐标轴上的投影有没有重叠。\n\n\n\n```python\nclass Solution:\n def isRectangleOverlap(self, rec1, rec2) -> bool:\n return ((min(rec1[2], rec2[2]) > max(rec1[0], rec2[0]))\n and (min(rec1[3], rec2[3]) > max(rec1[1], rec2[1])))\n\ns = Solution()\ns.isRectangleOverlap(rec1 = [0,0,2,2], rec2 = [1,1,3,3])\n\n#40 ms\t13.7 MB\n```\n\n","slug":"leetcode-836","published":1,"updated":"2020-03-25T14:41:44.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4h000bsubu68ng98xy","content":"<h3 id=\"836-__u77E9_u5F62_u91CD_u53E0\"><a href=\"#836-__u77E9_u5F62_u91CD_u53E0\" class=\"headerlink\" title=\"836. 矩形重叠\"></a>836. 矩形重叠</h3><p><a href=\"https://leetcode-cn.com/problems/rectangle-overlap/\" target=\"_blank\" rel=\"noopener\">题目</a></p>\n<a id=\"more\"></a>\n<p>看两个矩形有没有重叠,就看两个矩形在坐标轴上的投影有没有重叠。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">isRectangleOverlap</span><span class=\"params\">(self, rec1, rec2)</span> -&gt; bool:</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> ((min(rec1[<span class=\"number\">2</span>], rec2[<span class=\"number\">2</span>]) &gt; max(rec1[<span class=\"number\">0</span>], rec2[<span class=\"number\">0</span>]))</span><br><span class=\"line\"> <span class=\"keyword\">and</span> (min(rec1[<span class=\"number\">3</span>], rec2[<span class=\"number\">3</span>]) &gt; max(rec1[<span class=\"number\">1</span>], rec2[<span class=\"number\">1</span>])))</span><br><span class=\"line\"></span><br><span class=\"line\">s = Solution()</span><br><span class=\"line\">s.isRectangleOverlap(rec1 = [<span class=\"number\">0</span>,<span class=\"number\">0</span>,<span class=\"number\">2</span>,<span class=\"number\">2</span>], rec2 = [<span class=\"number\">1</span>,<span class=\"number\">1</span>,<span class=\"number\">3</span>,<span class=\"number\">3</span>])</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\">#40 ms\t13.7 MB</span></span><br></pre></td></tr></table></figure>\n","site":{"data":{}},"excerpt":"<h3 id=\"836-__u77E9_u5F62_u91CD_u53E0\"><a href=\"#836-__u77E9_u5F62_u91CD_u53E0\" class=\"headerlink\" title=\"836. 矩形重叠\"></a>836. 矩形重叠</h3><p><a href=\"https://leetcode-cn.com/problems/rectangle-overlap/\" target=\"_blank\" rel=\"noopener\">题目</a></p>","more":"<p>看两个矩形有没有重叠,就看两个矩形在坐标轴上的投影有没有重叠。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">isRectangleOverlap</span><span class=\"params\">(self, rec1, rec2)</span> -&gt; bool:</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> ((min(rec1[<span class=\"number\">2</span>], rec2[<span class=\"number\">2</span>]) &gt; max(rec1[<span class=\"number\">0</span>], rec2[<span class=\"number\">0</span>]))</span><br><span class=\"line\"> <span class=\"keyword\">and</span> (min(rec1[<span class=\"number\">3</span>], rec2[<span class=\"number\">3</span>]) &gt; max(rec1[<span class=\"number\">1</span>], rec2[<span class=\"number\">1</span>])))</span><br><span class=\"line\"></span><br><span class=\"line\">s = Solution()</span><br><span class=\"line\">s.isRectangleOverlap(rec1 = [<span class=\"number\">0</span>,<span class=\"number\">0</span>,<span class=\"number\">2</span>,<span class=\"number\">2</span>], rec2 = [<span class=\"number\">1</span>,<span class=\"number\">1</span>,<span class=\"number\">3</span>,<span class=\"number\">3</span>])</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\">#40 ms\t13.7 MB</span></span><br></pre></td></tr></table></figure>"},{"title":"leetcode-1013","date":"2020-03-29T13:09:22.000Z","_content":"\n### 1013. 将数组分成和相等的三个部分\n\n[题目](https://leetcode-cn.com/problems/partition-array-into-three-parts-with-equal-sum/)\n\n\n\n<!--more-->\n\n\n\n因为是整数数组如果能均分成三份则数组和肯定是3的倍数。然后遍历数组逐端求和使得和为 sum(A)/3。\n\n\n\n```python\nclass Solution:\n def canThreePartsEqualSum(self, A) -> bool:\n if not A:\n return False\n sa = sum(A)\n if sa % 3:\n return False\n s = sa // 3\n s1 = 0\n s2 = 0\n\n\n for i in range(len(A)):\n s1 += A[i]\n if s1 == s and (i+1) < len(A):\n for j in range(len(A[i+1:])):\n s2 += A[i+1+j]\n if s2 == s and j+1 < len(A[i+1:]) and sum(A[i+j+2:])== s:\n return True\n return False\n#60 ms\t18.7 MB\n```\n\n","source":"_posts/2020-03-29-leetcode-1013.md","raw":"---\ntitle: leetcode-1013\ndate: 2020-03-29 21:09:22\ntags:\ncategories: leetcode\n---\n\n### 1013. 将数组分成和相等的三个部分\n\n[题目](https://leetcode-cn.com/problems/partition-array-into-three-parts-with-equal-sum/)\n\n\n\n<!--more-->\n\n\n\n因为是整数数组如果能均分成三份则数组和肯定是3的倍数。然后遍历数组逐端求和使得和为 sum(A)/3。\n\n\n\n```python\nclass Solution:\n def canThreePartsEqualSum(self, A) -> bool:\n if not A:\n return False\n sa = sum(A)\n if sa % 3:\n return False\n s = sa // 3\n s1 = 0\n s2 = 0\n\n\n for i in range(len(A)):\n s1 += A[i]\n if s1 == s and (i+1) < len(A):\n for j in range(len(A[i+1:])):\n s2 += A[i+1+j]\n if s2 == s and j+1 < len(A[i+1:]) and sum(A[i+j+2:])== s:\n return True\n return False\n#60 ms\t18.7 MB\n```\n\n","slug":"leetcode-1013","published":1,"updated":"2020-03-29T13:15:11.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4i000dsubujxdgfcfh","content":"<h3 id=\"1013-__u5C06_u6570_u7EC4_u5206_u6210_u548C_u76F8_u7B49_u7684_u4E09_u4E2A_u90E8_u5206\"><a href=\"#1013-__u5C06_u6570_u7EC4_u5206_u6210_u548C_u76F8_u7B49_u7684_u4E09_u4E2A_u90E8_u5206\" class=\"headerlink\" title=\"1013. 将数组分成和相等的三个部分\"></a>1013. 将数组分成和相等的三个部分</h3><p><a href=\"https://leetcode-cn.com/problems/partition-array-into-three-parts-with-equal-sum/\" target=\"_blank\" rel=\"noopener\">题目</a></p>\n<a id=\"more\"></a>\n<p>因为是整数数组如果能均分成三份则数组和肯定是3的倍数。然后遍历数组逐端求和使得和为 sum(A)/3。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">canThreePartsEqualSum</span><span class=\"params\">(self, A)</span> -&gt; bool:</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> A:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"keyword\">False</span></span><br><span class=\"line\"> sa = sum(A)</span><br><span class=\"line\"> <span class=\"keyword\">if</span> sa % <span class=\"number\">3</span>:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"keyword\">False</span></span><br><span class=\"line\"> s = sa // <span class=\"number\">3</span></span><br><span class=\"line\"> s1 = <span class=\"number\">0</span></span><br><span class=\"line\"> s2 = <span class=\"number\">0</span></span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"keyword\">for</span> i <span class=\"keyword\">in</span> range(len(A)):</span><br><span class=\"line\"> s1 += A[i]</span><br><span class=\"line\"> <span class=\"keyword\">if</span> s1 == s <span class=\"keyword\">and</span> (i+<span class=\"number\">1</span>) &lt; len(A):</span><br><span class=\"line\"> <span class=\"keyword\">for</span> j <span class=\"keyword\">in</span> range(len(A[i+<span class=\"number\">1</span>:])):</span><br><span class=\"line\"> s2 += A[i+<span class=\"number\">1</span>+j]</span><br><span class=\"line\"> <span class=\"keyword\">if</span> s2 == s <span class=\"keyword\">and</span> j+<span class=\"number\">1</span> &lt; len(A[i+<span class=\"number\">1</span>:]) <span class=\"keyword\">and</span> sum(A[i+j+<span class=\"number\">2</span>:])== s:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"keyword\">True</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"keyword\">False</span></span><br><span class=\"line\"><span class=\"comment\">#60 ms\t18.7 MB</span></span><br></pre></td></tr></table></figure>\n","site":{"data":{}},"excerpt":"<h3 id=\"1013-__u5C06_u6570_u7EC4_u5206_u6210_u548C_u76F8_u7B49_u7684_u4E09_u4E2A_u90E8_u5206\"><a href=\"#1013-__u5C06_u6570_u7EC4_u5206_u6210_u548C_u76F8_u7B49_u7684_u4E09_u4E2A_u90E8_u5206\" class=\"headerlink\" title=\"1013. 将数组分成和相等的三个部分\"></a>1013. 将数组分成和相等的三个部分</h3><p><a href=\"https://leetcode-cn.com/problems/partition-array-into-three-parts-with-equal-sum/\" target=\"_blank\" rel=\"noopener\">题目</a></p>","more":"<p>因为是整数数组如果能均分成三份则数组和肯定是3的倍数。然后遍历数组逐端求和使得和为 sum(A)/3。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">canThreePartsEqualSum</span><span class=\"params\">(self, A)</span> -&gt; bool:</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> A:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"keyword\">False</span></span><br><span class=\"line\"> sa = sum(A)</span><br><span class=\"line\"> <span class=\"keyword\">if</span> sa % <span class=\"number\">3</span>:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"keyword\">False</span></span><br><span class=\"line\"> s = sa // <span class=\"number\">3</span></span><br><span class=\"line\"> s1 = <span class=\"number\">0</span></span><br><span class=\"line\"> s2 = <span class=\"number\">0</span></span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"keyword\">for</span> i <span class=\"keyword\">in</span> range(len(A)):</span><br><span class=\"line\"> s1 += A[i]</span><br><span class=\"line\"> <span class=\"keyword\">if</span> s1 == s <span class=\"keyword\">and</span> (i+<span class=\"number\">1</span>) &lt; len(A):</span><br><span class=\"line\"> <span class=\"keyword\">for</span> j <span class=\"keyword\">in</span> range(len(A[i+<span class=\"number\">1</span>:])):</span><br><span class=\"line\"> s2 += A[i+<span class=\"number\">1</span>+j]</span><br><span class=\"line\"> <span class=\"keyword\">if</span> s2 == s <span class=\"keyword\">and</span> j+<span class=\"number\">1</span> &lt; len(A[i+<span class=\"number\">1</span>:]) <span class=\"keyword\">and</span> sum(A[i+j+<span class=\"number\">2</span>:])== s:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"keyword\">True</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"keyword\">False</span></span><br><span class=\"line\"><span class=\"comment\">#60 ms\t18.7 MB</span></span><br></pre></td></tr></table></figure>"},{"title":"leetcode-876","date":"2020-03-26T13:18:41.000Z","_content":"\n### 876. 链表的中间结点\n\n\n\n[题目](https://leetcode-cn.com/problems/middle-of-the-linked-list/)\n\n\n\n<!--more-->\n\n\n\n思路是遍历一遍得到整个链表讲每个 node 放进一个 list就可以通过下标得到中间的。\n\n\n\n```python\n# Definition for singly-linked list.\nclass ListNode:\n def __init__(self, x):\n self.val = x\n self.next = None\n\nclass Solution:\n def middleNode(self, head: ListNode) -> ListNode:\n l = []\n n = head\n while n.next:\n l.append(n)\n n = n.next\n l.append(n)\n return l[len(l)//2]\n\n #44 ms\t13.7 MB\n```\n\n\n\n看官方解答还有一个骚操作通过两个速度不一样的指针一个一次走一步一个两次走一步快的走到底时慢的就在中间了。\n\n\n\n```python\nclass Solution:\n def middleNode(self, head: ListNode) -> ListNode:\n slow = fast = head\n while fast and fast.next:\n slow = slow.next\n fast = fast.next.next\n return slow\n\n作者LeetCode-Solution\n链接https://leetcode-cn.com/problems/middle-of-the-linked-list/solution/lian-biao-de-zhong-jian-jie-dian-by-leetcode-solut/\n来源力扣LeetCode\n著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。\n```\n\n\n\n\n","source":"_posts/2020-03-26-leetcode-876.md","raw":"---\ntitle: leetcode-876\ndate: 2020-03-26 21:18:41\ntags:\ncategories: leetcode\n---\n\n### 876. 链表的中间结点\n\n\n\n[题目](https://leetcode-cn.com/problems/middle-of-the-linked-list/)\n\n\n\n<!--more-->\n\n\n\n思路是遍历一遍得到整个链表讲每个 node 放进一个 list就可以通过下标得到中间的。\n\n\n\n```python\n# Definition for singly-linked list.\nclass ListNode:\n def __init__(self, x):\n self.val = x\n self.next = None\n\nclass Solution:\n def middleNode(self, head: ListNode) -> ListNode:\n l = []\n n = head\n while n.next:\n l.append(n)\n n = n.next\n l.append(n)\n return l[len(l)//2]\n\n #44 ms\t13.7 MB\n```\n\n\n\n看官方解答还有一个骚操作通过两个速度不一样的指针一个一次走一步一个两次走一步快的走到底时慢的就在中间了。\n\n\n\n```python\nclass Solution:\n def middleNode(self, head: ListNode) -> ListNode:\n slow = fast = head\n while fast and fast.next:\n slow = slow.next\n fast = fast.next.next\n return slow\n\n作者LeetCode-Solution\n链接https://leetcode-cn.com/problems/middle-of-the-linked-list/solution/lian-biao-de-zhong-jian-jie-dian-by-leetcode-solut/\n来源力扣LeetCode\n著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。\n```\n\n\n\n\n","slug":"leetcode-876","published":1,"updated":"2020-03-26T13:19:10.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4m000fsubu530zs4nj","content":"<h3 id=\"876-__u94FE_u8868_u7684_u4E2D_u95F4_u7ED3_u70B9\"><a href=\"#876-__u94FE_u8868_u7684_u4E2D_u95F4_u7ED3_u70B9\" class=\"headerlink\" title=\"876. 链表的中间结点\"></a>876. 链表的中间结点</h3><p><a href=\"https://leetcode-cn.com/problems/middle-of-the-linked-list/\" target=\"_blank\" rel=\"noopener\">题目</a></p>\n<a id=\"more\"></a>\n<p>思路是遍历一遍得到整个链表,讲每个 node 放进一个 list就可以通过下标得到中间的。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\"># Definition for singly-linked list.</span></span><br><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">ListNode</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">__init__</span><span class=\"params\">(self, x)</span>:</span></span><br><span class=\"line\"> self.val = x</span><br><span class=\"line\"> self.next = <span class=\"keyword\">None</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">middleNode</span><span class=\"params\">(self, head: ListNode)</span> -&gt; ListNode:</span></span><br><span class=\"line\"> l = []</span><br><span class=\"line\"> n = head</span><br><span class=\"line\"> <span class=\"keyword\">while</span> n.next:</span><br><span class=\"line\"> l.append(n)</span><br><span class=\"line\"> n = n.next</span><br><span class=\"line\"> l.append(n)</span><br><span class=\"line\"> <span class=\"keyword\">return</span> l[len(l)//<span class=\"number\">2</span>]</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"comment\">#44 ms\t13.7 MB</span></span><br></pre></td></tr></table></figure>\n<p>看官方解答,还有一个骚操作,通过两个速度不一样的指针,一个一次走一步,一个两次走一步,快的走到底时,慢的就在中间了。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">middleNode</span><span class=\"params\">(self, head: ListNode)</span> -&gt; ListNode:</span></span><br><span class=\"line\"> slow = fast = head</span><br><span class=\"line\"> <span class=\"keyword\">while</span> fast <span class=\"keyword\">and</span> fast.next:</span><br><span class=\"line\"> slow = slow.next</span><br><span class=\"line\"> fast = fast.next.next</span><br><span class=\"line\"> <span class=\"keyword\">return</span> slow</span><br><span class=\"line\"></span><br><span class=\"line\">作者LeetCode-Solution</span><br><span class=\"line\">链接https://leetcode-cn.com/problems/middle-of-the-linked-list/solution/lian-biao-de-zhong-jian-jie-dian-by-leetcode-solut/</span><br><span class=\"line\">来源力扣LeetCode</span><br><span class=\"line\">著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</span><br></pre></td></tr></table></figure>\n","site":{"data":{}},"excerpt":"<h3 id=\"876-__u94FE_u8868_u7684_u4E2D_u95F4_u7ED3_u70B9\"><a href=\"#876-__u94FE_u8868_u7684_u4E2D_u95F4_u7ED3_u70B9\" class=\"headerlink\" title=\"876. 链表的中间结点\"></a>876. 链表的中间结点</h3><p><a href=\"https://leetcode-cn.com/problems/middle-of-the-linked-list/\" target=\"_blank\" rel=\"noopener\">题目</a></p>","more":"<p>思路是遍历一遍得到整个链表,讲每个 node 放进一个 list就可以通过下标得到中间的。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\"># Definition for singly-linked list.</span></span><br><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">ListNode</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">__init__</span><span class=\"params\">(self, x)</span>:</span></span><br><span class=\"line\"> self.val = x</span><br><span class=\"line\"> self.next = <span class=\"keyword\">None</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">middleNode</span><span class=\"params\">(self, head: ListNode)</span> -&gt; ListNode:</span></span><br><span class=\"line\"> l = []</span><br><span class=\"line\"> n = head</span><br><span class=\"line\"> <span class=\"keyword\">while</span> n.next:</span><br><span class=\"line\"> l.append(n)</span><br><span class=\"line\"> n = n.next</span><br><span class=\"line\"> l.append(n)</span><br><span class=\"line\"> <span class=\"keyword\">return</span> l[len(l)//<span class=\"number\">2</span>]</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"comment\">#44 ms\t13.7 MB</span></span><br></pre></td></tr></table></figure>\n<p>看官方解答,还有一个骚操作,通过两个速度不一样的指针,一个一次走一步,一个两次走一步,快的走到底时,慢的就在中间了。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">middleNode</span><span class=\"params\">(self, head: ListNode)</span> -&gt; ListNode:</span></span><br><span class=\"line\"> slow = fast = head</span><br><span class=\"line\"> <span class=\"keyword\">while</span> fast <span class=\"keyword\">and</span> fast.next:</span><br><span class=\"line\"> slow = slow.next</span><br><span class=\"line\"> fast = fast.next.next</span><br><span class=\"line\"> <span class=\"keyword\">return</span> slow</span><br><span class=\"line\"></span><br><span class=\"line\">作者LeetCode-Solution</span><br><span class=\"line\">链接https://leetcode-cn.com/problems/middle-of-the-linked-list/solution/lian-biao-de-zhong-jian-jie-dian-by-leetcode-solut/</span><br><span class=\"line\">来源力扣LeetCode</span><br><span class=\"line\">著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</span><br></pre></td></tr></table></figure>"},{"title":"leetcode-914","date":"2020-03-29T14:41:09.000Z","_content":"\n### 914. 卡牌分组\n\n[题目](https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/)\n\n\n\n<!--more-->\n\n\n\n将大牌堆分成多个牌数量相等的小牌堆就是求每张牌数量的公约数。先遍历一遍得到每张牌的数量然后找出比2大的公约数即可。\n\n\n\n```python\nclass Solution:\n def hasGroupsSizeX(self, deck) -> bool:\n dc = {}\n max_d = 0\n for d in deck:\n if d not in dc:\n dc[d] = 0\n dc[d] += 1\n if max_d < d:\n max_d = d\n if max_d < dc[d]:\n max_d = dc[d]\n has_x = True\n if max_d == 1:\n max_d = 2\n\n for i in range(2, max_d + 1):\n has_x = True\n for k,v in dc.items():\n if v % i:\n has_x = False\n break\n if has_x and i >= 2:\n return True\n return False\n\n#56 ms\t13.8 MB\n```\n\n","source":"_posts/2020-03-29-leetcode-914.md","raw":"---\ntitle: leetcode-914\ndate: 2020-03-29 22:41:09\ntags:\ncategories: leetcode\n---\n\n### 914. 卡牌分组\n\n[题目](https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/)\n\n\n\n<!--more-->\n\n\n\n将大牌堆分成多个牌数量相等的小牌堆就是求每张牌数量的公约数。先遍历一遍得到每张牌的数量然后找出比2大的公约数即可。\n\n\n\n```python\nclass Solution:\n def hasGroupsSizeX(self, deck) -> bool:\n dc = {}\n max_d = 0\n for d in deck:\n if d not in dc:\n dc[d] = 0\n dc[d] += 1\n if max_d < d:\n max_d = d\n if max_d < dc[d]:\n max_d = dc[d]\n has_x = True\n if max_d == 1:\n max_d = 2\n\n for i in range(2, max_d + 1):\n has_x = True\n for k,v in dc.items():\n if v % i:\n has_x = False\n break\n if has_x and i >= 2:\n return True\n return False\n\n#56 ms\t13.8 MB\n```\n\n","slug":"leetcode-914","published":1,"updated":"2020-03-29T14:52:07.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4n000hsubu5guv78od","content":"<h3 id=\"914-__u5361_u724C_u5206_u7EC4\"><a href=\"#914-__u5361_u724C_u5206_u7EC4\" class=\"headerlink\" title=\"914. 卡牌分组\"></a>914. 卡牌分组</h3><p><a href=\"https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/\" target=\"_blank\" rel=\"noopener\">题目</a></p>\n<a id=\"more\"></a>\n<p>将大牌堆分成多个牌数量相等的小牌堆就是求每张牌数量的公约数。先遍历一遍得到每张牌的数量然后找出比2大的公约数即可。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">hasGroupsSizeX</span><span class=\"params\">(self, deck)</span> -&gt; bool:</span></span><br><span class=\"line\"> dc = &#123;&#125;</span><br><span class=\"line\"> max_d = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> d <span class=\"keyword\">in</span> deck:</span><br><span class=\"line\"> <span class=\"keyword\">if</span> d <span class=\"keyword\">not</span> <span class=\"keyword\">in</span> dc:</span><br><span class=\"line\"> dc[d] = <span class=\"number\">0</span></span><br><span class=\"line\"> dc[d] += <span class=\"number\">1</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> max_d &lt; d:</span><br><span class=\"line\"> max_d = d</span><br><span class=\"line\"> <span class=\"keyword\">if</span> max_d &lt; dc[d]:</span><br><span class=\"line\"> max_d = dc[d]</span><br><span class=\"line\"> has_x = <span class=\"keyword\">True</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> max_d == <span class=\"number\">1</span>:</span><br><span class=\"line\"> max_d = <span class=\"number\">2</span></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"keyword\">for</span> i <span class=\"keyword\">in</span> range(<span class=\"number\">2</span>, max_d + <span class=\"number\">1</span>):</span><br><span class=\"line\"> has_x = <span class=\"keyword\">True</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> k,v <span class=\"keyword\">in</span> dc.items():</span><br><span class=\"line\"> <span class=\"keyword\">if</span> v % i:</span><br><span class=\"line\"> has_x = <span class=\"keyword\">False</span></span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> has_x <span class=\"keyword\">and</span> i &gt;= <span class=\"number\">2</span>:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"keyword\">True</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"keyword\">False</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\">#56 ms\t13.8 MB</span></span><br></pre></td></tr></table></figure>\n","site":{"data":{}},"excerpt":"<h3 id=\"914-__u5361_u724C_u5206_u7EC4\"><a href=\"#914-__u5361_u724C_u5206_u7EC4\" class=\"headerlink\" title=\"914. 卡牌分组\"></a>914. 卡牌分组</h3><p><a href=\"https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/\" target=\"_blank\" rel=\"noopener\">题目</a></p>","more":"<p>将大牌堆分成多个牌数量相等的小牌堆就是求每张牌数量的公约数。先遍历一遍得到每张牌的数量然后找出比2大的公约数即可。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">hasGroupsSizeX</span><span class=\"params\">(self, deck)</span> -&gt; bool:</span></span><br><span class=\"line\"> dc = &#123;&#125;</span><br><span class=\"line\"> max_d = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> d <span class=\"keyword\">in</span> deck:</span><br><span class=\"line\"> <span class=\"keyword\">if</span> d <span class=\"keyword\">not</span> <span class=\"keyword\">in</span> dc:</span><br><span class=\"line\"> dc[d] = <span class=\"number\">0</span></span><br><span class=\"line\"> dc[d] += <span class=\"number\">1</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> max_d &lt; d:</span><br><span class=\"line\"> max_d = d</span><br><span class=\"line\"> <span class=\"keyword\">if</span> max_d &lt; dc[d]:</span><br><span class=\"line\"> max_d = dc[d]</span><br><span class=\"line\"> has_x = <span class=\"keyword\">True</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> max_d == <span class=\"number\">1</span>:</span><br><span class=\"line\"> max_d = <span class=\"number\">2</span></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"keyword\">for</span> i <span class=\"keyword\">in</span> range(<span class=\"number\">2</span>, max_d + <span class=\"number\">1</span>):</span><br><span class=\"line\"> has_x = <span class=\"keyword\">True</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> k,v <span class=\"keyword\">in</span> dc.items():</span><br><span class=\"line\"> <span class=\"keyword\">if</span> v % i:</span><br><span class=\"line\"> has_x = <span class=\"keyword\">False</span></span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> has_x <span class=\"keyword\">and</span> i &gt;= <span class=\"number\">2</span>:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"keyword\">True</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"keyword\">False</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\">#56 ms\t13.8 MB</span></span><br></pre></td></tr></table></figure>"},{"title":"leetcode-1071","date":"2020-03-30T14:03:01.000Z","_content":"\n### 1071. 字符串的最大公因子\n\n[题目](https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/)\n\n\n\n<!--more-->\n\n\n\n如果存在这样字符串那它最大的长度就是这两个字符串长度的最大公约数。\n\n\n\n```python\nclass Solution:\n def gcdOfStrings(self, str1: str, str2: str) -> str:\n if str1[0] != str2[0]:\n return ''\n\n a = len(str1)\n b = len(str2)\n print(a, b)\n if a < b:\n str1, str2 = str2, str1\n a = len(str1)\n b = len(str2)\n\n if not a%b:\n for x in range(0, a//b):\n if str1[x*b:(x+1)*b] != str2:\n return ''\n return str2\n else:\n for x in range(b, 0, -1):\n print(x)\n if x==b or b%x or a%x:\n continue\n for y in range(0, b//x):\n if str2[y*x:(y+1)*x] != str2[b-x:b]:\n return ''\n for y in range(0, a//x):\n if str1[y*x:(y+1)*x] != str2[0:x]:\n return ''\n return str2[0:x]\n# 44 ms\t13.9 MB\n```\n\n\n\n官方解答中还给了一种巧妙的解法如果 str1 + str2 == str2 + str1 的话,[可以证明](https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/solution/zi-fu-chuan-de-zui-da-gong-yin-zi-by-leetcode-solu/)必定存在这样一个字符串,其长度为两个字符串长度的最大公约数。\n\n","source":"_posts/2020-03-30-leetcode-1071.md","raw":"---\ntitle: leetcode-1071\ndate: 2020-03-30 22:03:01\ntags:\ncategories: leetcode\n---\n\n### 1071. 字符串的最大公因子\n\n[题目](https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/)\n\n\n\n<!--more-->\n\n\n\n如果存在这样字符串那它最大的长度就是这两个字符串长度的最大公约数。\n\n\n\n```python\nclass Solution:\n def gcdOfStrings(self, str1: str, str2: str) -> str:\n if str1[0] != str2[0]:\n return ''\n\n a = len(str1)\n b = len(str2)\n print(a, b)\n if a < b:\n str1, str2 = str2, str1\n a = len(str1)\n b = len(str2)\n\n if not a%b:\n for x in range(0, a//b):\n if str1[x*b:(x+1)*b] != str2:\n return ''\n return str2\n else:\n for x in range(b, 0, -1):\n print(x)\n if x==b or b%x or a%x:\n continue\n for y in range(0, b//x):\n if str2[y*x:(y+1)*x] != str2[b-x:b]:\n return ''\n for y in range(0, a//x):\n if str1[y*x:(y+1)*x] != str2[0:x]:\n return ''\n return str2[0:x]\n# 44 ms\t13.9 MB\n```\n\n\n\n官方解答中还给了一种巧妙的解法如果 str1 + str2 == str2 + str1 的话,[可以证明](https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/solution/zi-fu-chuan-de-zui-da-gong-yin-zi-by-leetcode-solu/)必定存在这样一个字符串,其长度为两个字符串长度的最大公约数。\n\n","slug":"leetcode-1071","published":1,"updated":"2020-03-30T14:04:17.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4o000jsubub8g0257f","content":"<h3 id=\"1071-__u5B57_u7B26_u4E32_u7684_u6700_u5927_u516C_u56E0_u5B50\"><a href=\"#1071-__u5B57_u7B26_u4E32_u7684_u6700_u5927_u516C_u56E0_u5B50\" class=\"headerlink\" title=\"1071. 字符串的最大公因子\"></a>1071. 字符串的最大公因子</h3><p><a href=\"https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/\" target=\"_blank\" rel=\"noopener\">题目</a></p>\n<a id=\"more\"></a>\n<p>如果存在这样字符串,那它最大的长度就是这两个字符串长度的最大公约数。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">gcdOfStrings</span><span class=\"params\">(self, str1: str, str2: str)</span> -&gt; str:</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> str1[<span class=\"number\">0</span>] != str2[<span class=\"number\">0</span>]:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"string\">''</span></span><br><span class=\"line\"></span><br><span class=\"line\"> a = len(str1)</span><br><span class=\"line\"> b = len(str2)</span><br><span class=\"line\"> print(a, b)</span><br><span class=\"line\"> <span class=\"keyword\">if</span> a &lt; b:</span><br><span class=\"line\"> str1, str2 = str2, str1</span><br><span class=\"line\"> a = len(str1)</span><br><span class=\"line\"> b = len(str2)</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> a%b:</span><br><span class=\"line\"> <span class=\"keyword\">for</span> x <span class=\"keyword\">in</span> range(<span class=\"number\">0</span>, a//b):</span><br><span class=\"line\"> <span class=\"keyword\">if</span> str1[x*b:(x+<span class=\"number\">1</span>)*b] != str2:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"string\">''</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> str2</span><br><span class=\"line\"> <span class=\"keyword\">else</span>:</span><br><span class=\"line\"> <span class=\"keyword\">for</span> x <span class=\"keyword\">in</span> range(b, <span class=\"number\">0</span>, <span class=\"number\">-1</span>):</span><br><span class=\"line\"> print(x)</span><br><span class=\"line\"> <span class=\"keyword\">if</span> x==b <span class=\"keyword\">or</span> b%x <span class=\"keyword\">or</span> a%x:</span><br><span class=\"line\"> <span class=\"keyword\">continue</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> y <span class=\"keyword\">in</span> range(<span class=\"number\">0</span>, b//x):</span><br><span class=\"line\"> <span class=\"keyword\">if</span> str2[y*x:(y+<span class=\"number\">1</span>)*x] != str2[b-x:b]:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"string\">''</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> y <span class=\"keyword\">in</span> range(<span class=\"number\">0</span>, a//x):</span><br><span class=\"line\"> <span class=\"keyword\">if</span> str1[y*x:(y+<span class=\"number\">1</span>)*x] != str2[<span class=\"number\">0</span>:x]:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"string\">''</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> str2[<span class=\"number\">0</span>:x]</span><br><span class=\"line\"><span class=\"comment\"># 44 ms\t13.9 MB</span></span><br></pre></td></tr></table></figure>\n<p>官方解答中还给了一种巧妙的解法,如果 str1 + str2 == str2 + str1 的话,<a href=\"https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/solution/zi-fu-chuan-de-zui-da-gong-yin-zi-by-leetcode-solu/\" target=\"_blank\" rel=\"noopener\">可以证明</a>必定存在这样一个字符串,其长度为两个字符串长度的最大公约数。</p>\n","site":{"data":{}},"excerpt":"<h3 id=\"1071-__u5B57_u7B26_u4E32_u7684_u6700_u5927_u516C_u56E0_u5B50\"><a href=\"#1071-__u5B57_u7B26_u4E32_u7684_u6700_u5927_u516C_u56E0_u5B50\" class=\"headerlink\" title=\"1071. 字符串的最大公因子\"></a>1071. 字符串的最大公因子</h3><p><a href=\"https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/\" target=\"_blank\" rel=\"noopener\">题目</a></p>","more":"<p>如果存在这样字符串,那它最大的长度就是这两个字符串长度的最大公约数。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">gcdOfStrings</span><span class=\"params\">(self, str1: str, str2: str)</span> -&gt; str:</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> str1[<span class=\"number\">0</span>] != str2[<span class=\"number\">0</span>]:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"string\">''</span></span><br><span class=\"line\"></span><br><span class=\"line\"> a = len(str1)</span><br><span class=\"line\"> b = len(str2)</span><br><span class=\"line\"> print(a, b)</span><br><span class=\"line\"> <span class=\"keyword\">if</span> a &lt; b:</span><br><span class=\"line\"> str1, str2 = str2, str1</span><br><span class=\"line\"> a = len(str1)</span><br><span class=\"line\"> b = len(str2)</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> a%b:</span><br><span class=\"line\"> <span class=\"keyword\">for</span> x <span class=\"keyword\">in</span> range(<span class=\"number\">0</span>, a//b):</span><br><span class=\"line\"> <span class=\"keyword\">if</span> str1[x*b:(x+<span class=\"number\">1</span>)*b] != str2:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"string\">''</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> str2</span><br><span class=\"line\"> <span class=\"keyword\">else</span>:</span><br><span class=\"line\"> <span class=\"keyword\">for</span> x <span class=\"keyword\">in</span> range(b, <span class=\"number\">0</span>, <span class=\"number\">-1</span>):</span><br><span class=\"line\"> print(x)</span><br><span class=\"line\"> <span class=\"keyword\">if</span> x==b <span class=\"keyword\">or</span> b%x <span class=\"keyword\">or</span> a%x:</span><br><span class=\"line\"> <span class=\"keyword\">continue</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> y <span class=\"keyword\">in</span> range(<span class=\"number\">0</span>, b//x):</span><br><span class=\"line\"> <span class=\"keyword\">if</span> str2[y*x:(y+<span class=\"number\">1</span>)*x] != str2[b-x:b]:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"string\">''</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> y <span class=\"keyword\">in</span> range(<span class=\"number\">0</span>, a//x):</span><br><span class=\"line\"> <span class=\"keyword\">if</span> str1[y*x:(y+<span class=\"number\">1</span>)*x] != str2[<span class=\"number\">0</span>:x]:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"string\">''</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> str2[<span class=\"number\">0</span>:x]</span><br><span class=\"line\"><span class=\"comment\"># 44 ms\t13.9 MB</span></span><br></pre></td></tr></table></figure>\n<p>官方解答中还给了一种巧妙的解法,如果 str1 + str2 == str2 + str1 的话,<a href=\"https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/solution/zi-fu-chuan-de-zui-da-gong-yin-zi-by-leetcode-solu/\" target=\"_blank\" rel=\"noopener\">可以证明</a>必定存在这样一个字符串,其长度为两个字符串长度的最大公约数。</p>"},{"title":"leetcode-999","date":"2020-03-30T13:03:25.000Z","_content":"\n\n### 999. 可以被一步捕获的棋子数\n\n[题目](https://leetcode-cn.com/problems/available-captures-for-rook/)\n\n\n\n<!--more-->\n\n\n\n遍历一遍找到车的坐标然后按上下左右四个方向循环一下看碰到的第一个棋子是什么。\n\n\n\n```python\nclass Solution:\n def numRookCaptures(self, board) -> int:\n i = j = 0\n for row in board:\n if 'R' in row:\n break\n i += 1\n j = row.index('R')\n count = 0\n # right\n for x in range(j + 1, 8):\n if row[x] == 'p':\n count += 1\n break\n if row[x] == 'B':\n break\n # left\n for x in range(j, 0, -1):\n if row[x] == 'p':\n count += 1\n break\n if row[x] == 'B':\n break\n # up\n for x in range(i, 0, -1):\n if board[x][j] == 'p':\n count += 1\n break\n if board[x][j] == 'B':\n break\n # down\n for x in range(i+1, 8):\n if board[x][j] == 'p':\n count += 1\n break\n if board[x][j] == 'B':\n break\n\n return count\n\n#36 ms\t13.6 MB\n\n```\n\n\n\n问题不难官方解答中给了一个方向数组的概念上下左右是 (0, 1) (0, -1) (-1, 0) (1, 0),有点像向量的意思。走的路线等于方向数组乘以步数。\n\n","source":"_posts/2020-03-30-leetcode-999.md","raw":"---\ntitle: leetcode-999\ndate: 2020-03-30 21:03:25\ntags:\ncategories: leetcode\n---\n\n\n### 999. 可以被一步捕获的棋子数\n\n[题目](https://leetcode-cn.com/problems/available-captures-for-rook/)\n\n\n\n<!--more-->\n\n\n\n遍历一遍找到车的坐标然后按上下左右四个方向循环一下看碰到的第一个棋子是什么。\n\n\n\n```python\nclass Solution:\n def numRookCaptures(self, board) -> int:\n i = j = 0\n for row in board:\n if 'R' in row:\n break\n i += 1\n j = row.index('R')\n count = 0\n # right\n for x in range(j + 1, 8):\n if row[x] == 'p':\n count += 1\n break\n if row[x] == 'B':\n break\n # left\n for x in range(j, 0, -1):\n if row[x] == 'p':\n count += 1\n break\n if row[x] == 'B':\n break\n # up\n for x in range(i, 0, -1):\n if board[x][j] == 'p':\n count += 1\n break\n if board[x][j] == 'B':\n break\n # down\n for x in range(i+1, 8):\n if board[x][j] == 'p':\n count += 1\n break\n if board[x][j] == 'B':\n break\n\n return count\n\n#36 ms\t13.6 MB\n\n```\n\n\n\n问题不难官方解答中给了一个方向数组的概念上下左右是 (0, 1) (0, -1) (-1, 0) (1, 0),有点像向量的意思。走的路线等于方向数组乘以步数。\n\n","slug":"leetcode-999","published":1,"updated":"2020-03-30T13:03:41.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4p000lsubu6henmdmq","content":"<h3 id=\"999-__u53EF_u4EE5_u88AB_u4E00_u6B65_u6355_u83B7_u7684_u68CB_u5B50_u6570\"><a href=\"#999-__u53EF_u4EE5_u88AB_u4E00_u6B65_u6355_u83B7_u7684_u68CB_u5B50_u6570\" class=\"headerlink\" title=\"999. 可以被一步捕获的棋子数\"></a>999. 可以被一步捕获的棋子数</h3><p><a href=\"https://leetcode-cn.com/problems/available-captures-for-rook/\" target=\"_blank\" rel=\"noopener\">题目</a></p>\n<a id=\"more\"></a>\n<p>遍历一遍找到车的坐标,然后按上下左右四个方向循环一下看碰到的第一个棋子是什么。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">numRookCaptures</span><span class=\"params\">(self, board)</span> -&gt; int:</span></span><br><span class=\"line\"> i = j = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> row <span class=\"keyword\">in</span> board:</span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"string\">'R'</span> <span class=\"keyword\">in</span> row:</span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"> i += <span class=\"number\">1</span></span><br><span class=\"line\"> j = row.index(<span class=\"string\">'R'</span>)</span><br><span class=\"line\"> count = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"comment\"># right</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> x <span class=\"keyword\">in</span> range(j + <span class=\"number\">1</span>, <span class=\"number\">8</span>):</span><br><span class=\"line\"> <span class=\"keyword\">if</span> row[x] == <span class=\"string\">'p'</span>:</span><br><span class=\"line\"> count += <span class=\"number\">1</span></span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> row[x] == <span class=\"string\">'B'</span>:</span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"> <span class=\"comment\"># left</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> x <span class=\"keyword\">in</span> range(j, <span class=\"number\">0</span>, <span class=\"number\">-1</span>):</span><br><span class=\"line\"> <span class=\"keyword\">if</span> row[x] == <span class=\"string\">'p'</span>:</span><br><span class=\"line\"> count += <span class=\"number\">1</span></span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> row[x] == <span class=\"string\">'B'</span>:</span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"> <span class=\"comment\"># up</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> x <span class=\"keyword\">in</span> range(i, <span class=\"number\">0</span>, <span class=\"number\">-1</span>):</span><br><span class=\"line\"> <span class=\"keyword\">if</span> board[x][j] == <span class=\"string\">'p'</span>:</span><br><span class=\"line\"> count += <span class=\"number\">1</span></span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> board[x][j] == <span class=\"string\">'B'</span>:</span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"> <span class=\"comment\"># down</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> x <span class=\"keyword\">in</span> range(i+<span class=\"number\">1</span>, <span class=\"number\">8</span>):</span><br><span class=\"line\"> <span class=\"keyword\">if</span> board[x][j] == <span class=\"string\">'p'</span>:</span><br><span class=\"line\"> count += <span class=\"number\">1</span></span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> board[x][j] == <span class=\"string\">'B'</span>:</span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"keyword\">return</span> count</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\">#36 ms\t13.6 MB</span></span><br></pre></td></tr></table></figure>\n<p>问题不难,官方解答中给了一个方向数组的概念,上下左右是 (0, 1) (0, -1) (-1, 0) (1, 0),有点像向量的意思。走的路线等于方向数组乘以步数。</p>\n","site":{"data":{}},"excerpt":"<h3 id=\"999-__u53EF_u4EE5_u88AB_u4E00_u6B65_u6355_u83B7_u7684_u68CB_u5B50_u6570\"><a href=\"#999-__u53EF_u4EE5_u88AB_u4E00_u6B65_u6355_u83B7_u7684_u68CB_u5B50_u6570\" class=\"headerlink\" title=\"999. 可以被一步捕获的棋子数\"></a>999. 可以被一步捕获的棋子数</h3><p><a href=\"https://leetcode-cn.com/problems/available-captures-for-rook/\" target=\"_blank\" rel=\"noopener\">题目</a></p>","more":"<p>遍历一遍找到车的坐标,然后按上下左右四个方向循环一下看碰到的第一个棋子是什么。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">numRookCaptures</span><span class=\"params\">(self, board)</span> -&gt; int:</span></span><br><span class=\"line\"> i = j = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> row <span class=\"keyword\">in</span> board:</span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"string\">'R'</span> <span class=\"keyword\">in</span> row:</span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"> i += <span class=\"number\">1</span></span><br><span class=\"line\"> j = row.index(<span class=\"string\">'R'</span>)</span><br><span class=\"line\"> count = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"comment\"># right</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> x <span class=\"keyword\">in</span> range(j + <span class=\"number\">1</span>, <span class=\"number\">8</span>):</span><br><span class=\"line\"> <span class=\"keyword\">if</span> row[x] == <span class=\"string\">'p'</span>:</span><br><span class=\"line\"> count += <span class=\"number\">1</span></span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> row[x] == <span class=\"string\">'B'</span>:</span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"> <span class=\"comment\"># left</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> x <span class=\"keyword\">in</span> range(j, <span class=\"number\">0</span>, <span class=\"number\">-1</span>):</span><br><span class=\"line\"> <span class=\"keyword\">if</span> row[x] == <span class=\"string\">'p'</span>:</span><br><span class=\"line\"> count += <span class=\"number\">1</span></span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> row[x] == <span class=\"string\">'B'</span>:</span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"> <span class=\"comment\"># up</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> x <span class=\"keyword\">in</span> range(i, <span class=\"number\">0</span>, <span class=\"number\">-1</span>):</span><br><span class=\"line\"> <span class=\"keyword\">if</span> board[x][j] == <span class=\"string\">'p'</span>:</span><br><span class=\"line\"> count += <span class=\"number\">1</span></span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> board[x][j] == <span class=\"string\">'B'</span>:</span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"> <span class=\"comment\"># down</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> x <span class=\"keyword\">in</span> range(i+<span class=\"number\">1</span>, <span class=\"number\">8</span>):</span><br><span class=\"line\"> <span class=\"keyword\">if</span> board[x][j] == <span class=\"string\">'p'</span>:</span><br><span class=\"line\"> count += <span class=\"number\">1</span></span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> board[x][j] == <span class=\"string\">'B'</span>:</span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"keyword\">return</span> count</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\">#36 ms\t13.6 MB</span></span><br></pre></td></tr></table></figure>\n<p>问题不难,官方解答中给了一个方向数组的概念,上下左右是 (0, 1) (0, -1) (-1, 0) (1, 0),有点像向量的意思。走的路线等于方向数组乘以步数。</p>"},{"title":"leetcode-1103","date":"2020-04-01T03:22:20.000Z","mathjax":true,"_content":"\n### 1103. 分糖果 II\n\n[题目](https://leetcode-cn.com/problems/distribute-candies-to-people/)\n\n\n\n<!--more-->\n\n\n\n小学奥数题。主要思路就是等差数列求和 $\\cfrac{(首项 + 末项)×项数}{2}$ 。可以用公式把每一个位置获得的总糖果数表示出来。我的方法稍微蠢了点,算了每一轮的总糖果数,其实可以直接求总共发了多少次糖果,除以每轮的人数就可以得出发了多少轮。\n\n\n\n```python\nclass Solution:\n def distributeCandies(self, candies: int, num_people: int):\n total = 0\n i = 0\n # import ipdb; ipdb.set_trace()\n while total <= candies:\n t = (num_people*i)*num_people + int((1+num_people)*num_people/2)\n if total + t <= candies:\n total += t\n i += 1\n else:\n break\n remaining = candies - total\n print(total, remaining, i)\n l = []\n for n in range(1, num_people+1):\n if not total:\n current_candy = n\n else:\n current_candy = n+i*num_people\n\n n_count = int((0+(i-1))*(i)/2)\n print(current_candy, n_count)\n if remaining >= current_candy:\n l.append(n_count*num_people + n*i + current_candy)\n remaining -= current_candy\n else:\n l.append(n_count*num_people + n*i + remaining)\n remaining = 0\n return l\n# 28 ms\t13.7 MB,\n```\n","source":"_posts/2020-04-01-leetcode-1103.md","raw":"---\ntitle: leetcode-1103\ndate: 2020-04-01 11:22:20\ntags:\ncategories: leetcode\nmathjax: true\n---\n\n### 1103. 分糖果 II\n\n[题目](https://leetcode-cn.com/problems/distribute-candies-to-people/)\n\n\n\n<!--more-->\n\n\n\n小学奥数题。主要思路就是等差数列求和 $\\cfrac{(首项 + 末项)×项数}{2}$ 。可以用公式把每一个位置获得的总糖果数表示出来。我的方法稍微蠢了点,算了每一轮的总糖果数,其实可以直接求总共发了多少次糖果,除以每轮的人数就可以得出发了多少轮。\n\n\n\n```python\nclass Solution:\n def distributeCandies(self, candies: int, num_people: int):\n total = 0\n i = 0\n # import ipdb; ipdb.set_trace()\n while total <= candies:\n t = (num_people*i)*num_people + int((1+num_people)*num_people/2)\n if total + t <= candies:\n total += t\n i += 1\n else:\n break\n remaining = candies - total\n print(total, remaining, i)\n l = []\n for n in range(1, num_people+1):\n if not total:\n current_candy = n\n else:\n current_candy = n+i*num_people\n\n n_count = int((0+(i-1))*(i)/2)\n print(current_candy, n_count)\n if remaining >= current_candy:\n l.append(n_count*num_people + n*i + current_candy)\n remaining -= current_candy\n else:\n l.append(n_count*num_people + n*i + remaining)\n remaining = 0\n return l\n# 28 ms\t13.7 MB,\n```\n","slug":"leetcode-1103","published":1,"updated":"2020-04-08T17:17:27.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4q000nsubuw1s0x6b6","content":"<h3 id=\"1103-__u5206_u7CD6_u679C_II\"><a href=\"#1103-__u5206_u7CD6_u679C_II\" class=\"headerlink\" title=\"1103. 分糖果 II\"></a>1103. 分糖果 II</h3><p><a href=\"https://leetcode-cn.com/problems/distribute-candies-to-people/\" target=\"_blank\" rel=\"noopener\">题目</a></p>\n<a id=\"more\"></a>\n<p>小学奥数题。主要思路就是等差数列求和 <mjx-container class=\"MathJax\" jax=\"SVG\"><svg style=\"vertical-align: -1.625ex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20.379ex\" height=\"4.656ex\" role=\"img\" focusable=\"false\" viewbox=\"0 -1340 9007.3 2058.1\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"matrix(1 0 0 -1 0 0)\"><g data-mml-node=\"math\"><g data-mml-node=\"mfrac\"><g data-mml-node=\"mrow\" transform=\"translate(220, 590) scale(0.707)\"><g data-mml-node=\"mpadded\"><g data-mml-node=\"mrow\"/></g><g data-mml-node=\"mstyle\" transform=\"scale(1.414)\"><g data-mml-node=\"TeXAtom\" data-mjx-texclass=\"ORD\"><g data-mml-node=\"mo\"><use xlink:href=\"#MJX-TEX-N-28\"/></g><g data-mml-node=\"mo\" transform=\"translate(389, 0)\"><text data-variant=\"normal\" transform=\"matrix(1 0 0 -1 0 0)\" font-size=\"884px\" font-family=\"serif\">首</text><text data-variant=\"normal\" transform=\"translate(900, 0) matrix(1 0 0 -1 0 0)\" font-size=\"884px\" font-family=\"serif\">项</text></g><g data-mml-node=\"mo\" transform=\"translate(2466.8, 0)\"><use xlink:href=\"#MJX-TEX-N-2B\"/></g><g data-mml-node=\"mo\" transform=\"translate(3522.6, 0)\"><text data-variant=\"normal\" transform=\"matrix(1 0 0 -1 0 0)\" font-size=\"884px\" font-family=\"serif\">末</text><text data-variant=\"normal\" transform=\"translate(900, 0) matrix(1 0 0 -1 0 0)\" font-size=\"884px\" font-family=\"serif\">项</text></g><g data-mml-node=\"mo\" transform=\"translate(5322.6, 0)\"><use xlink:href=\"#MJX-TEX-N-29\"/></g><g data-mml-node=\"mo\" transform=\"translate(5711.6, 0)\"><use xlink:href=\"#MJX-TEX-N-D7\"/></g><g data-mml-node=\"mo\" transform=\"translate(6767.3, 0)\"><text data-variant=\"normal\" transform=\"matrix(1 0 0 -1 0 0)\" font-size=\"884px\" font-family=\"serif\">项</text><text data-variant=\"normal\" transform=\"translate(900, 0) matrix(1 0 0 -1 0 0)\" font-size=\"884px\" font-family=\"serif\">数</text></g></g></g></g><g data-mml-node=\"mrow\" transform=\"translate(4253.7, -506) scale(0.707)\"><g data-mml-node=\"mpadded\"><g data-mml-node=\"mrow\"/></g><g data-mml-node=\"mstyle\" transform=\"scale(1.414)\"><g data-mml-node=\"TeXAtom\" data-mjx-texclass=\"ORD\"><g data-mml-node=\"mn\"><use xlink:href=\"#MJX-TEX-N-32\"/></g></g></g></g><rect width=\"8767.3\" height=\"60\" x=\"120\" y=\"220\"/></g></g></g></svg></mjx-container> 。可以用公式把每一个位置获得的总糖果数表示出来。我的方法稍微蠢了点,算了每一轮的总糖果数,其实可以直接求总共发了多少次糖果,除以每轮的人数就可以得出发了多少轮。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">distributeCandies</span><span class=\"params\">(self, candies: int, num_people: int)</span>:</span></span><br><span class=\"line\"> total = <span class=\"number\">0</span></span><br><span class=\"line\"> i = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"comment\"># import ipdb; ipdb.set_trace()</span></span><br><span class=\"line\"> <span class=\"keyword\">while</span> total &lt;= candies:</span><br><span class=\"line\"> t = (num_people*i)*num_people + int((<span class=\"number\">1</span>+num_people)*num_people/<span class=\"number\">2</span>)</span><br><span class=\"line\"> <span class=\"keyword\">if</span> total + t &lt;= candies:</span><br><span class=\"line\"> total += t</span><br><span class=\"line\"> i += <span class=\"number\">1</span></span><br><span class=\"line\"> <span class=\"keyword\">else</span>:</span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"> remaining = candies - total</span><br><span class=\"line\"> print(total, remaining, i)</span><br><span class=\"line\"> l = []</span><br><span class=\"line\"> <span class=\"keyword\">for</span> n <span class=\"keyword\">in</span> range(<span class=\"number\">1</span>, num_people+<span class=\"number\">1</span>):</span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> total:</span><br><span class=\"line\"> current_candy = n</span><br><span class=\"line\"> <span class=\"keyword\">else</span>:</span><br><span class=\"line\"> current_candy = n+i*num_people</span><br><span class=\"line\"></span><br><span class=\"line\"> n_count = int((<span class=\"number\">0</span>+(i<span class=\"number\">-1</span>))*(i)/<span class=\"number\">2</span>)</span><br><span class=\"line\"> print(current_candy, n_count)</span><br><span class=\"line\"> <span class=\"keyword\">if</span> remaining &gt;= current_candy:</span><br><span class=\"line\"> l.append(n_count*num_people + n*i + current_candy)</span><br><span class=\"line\"> remaining -= current_candy</span><br><span class=\"line\"> <span class=\"keyword\">else</span>:</span><br><span class=\"line\"> l.append(n_count*num_people + n*i + remaining)</span><br><span class=\"line\"> remaining = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> l</span><br><span class=\"line\"><span class=\"comment\"># 28 ms\t13.7 MB,</span></span><br></pre></td></tr></table></figure>\n<svg style=\"display: none\" id=\"MJX-SVG-global-cache\"><defs><path id=\"MJX-TEX-N-28\" d=\"M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z\"/><path id=\"MJX-TEX-N-2B\" d=\"M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z\"/><path id=\"MJX-TEX-N-29\" d=\"M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z\"/><path id=\"MJX-TEX-N-D7\" d=\"M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z\"/><path id=\"MJX-TEX-N-32\" d=\"M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z\"/></defs></svg>","site":{"data":{}},"excerpt":"<h3 id=\"1103-__u5206_u7CD6_u679C_II\"><a href=\"#1103-__u5206_u7CD6_u679C_II\" class=\"headerlink\" title=\"1103. 分糖果 II\"></a>1103. 分糖果 II</h3><p><a href=\"https://leetcode-cn.com/problems/distribute-candies-to-people/\" target=\"_blank\" rel=\"noopener\">题目</a></p>","more":"<p>小学奥数题。主要思路就是等差数列求和 <mjx-container class=\"MathJax\" jax=\"SVG\"><svg style=\"vertical-align: -1.625ex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20.379ex\" height=\"4.656ex\" role=\"img\" focusable=\"false\" viewbox=\"0 -1340 9007.3 2058.1\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"matrix(1 0 0 -1 0 0)\"><g data-mml-node=\"math\"><g data-mml-node=\"mfrac\"><g data-mml-node=\"mrow\" transform=\"translate(220, 590) scale(0.707)\"><g data-mml-node=\"mpadded\"><g data-mml-node=\"mrow\"/></g><g data-mml-node=\"mstyle\" transform=\"scale(1.414)\"><g data-mml-node=\"TeXAtom\" data-mjx-texclass=\"ORD\"><g data-mml-node=\"mo\"><use xlink:href=\"#MJX-TEX-N-28\"/></g><g data-mml-node=\"mo\" transform=\"translate(389, 0)\"><text data-variant=\"normal\" transform=\"matrix(1 0 0 -1 0 0)\" font-size=\"884px\" font-family=\"serif\">首</text><text data-variant=\"normal\" transform=\"translate(900, 0) matrix(1 0 0 -1 0 0)\" font-size=\"884px\" font-family=\"serif\">项</text></g><g data-mml-node=\"mo\" transform=\"translate(2466.8, 0)\"><use xlink:href=\"#MJX-TEX-N-2B\"/></g><g data-mml-node=\"mo\" transform=\"translate(3522.6, 0)\"><text data-variant=\"normal\" transform=\"matrix(1 0 0 -1 0 0)\" font-size=\"884px\" font-family=\"serif\">末</text><text data-variant=\"normal\" transform=\"translate(900, 0) matrix(1 0 0 -1 0 0)\" font-size=\"884px\" font-family=\"serif\">项</text></g><g data-mml-node=\"mo\" transform=\"translate(5322.6, 0)\"><use xlink:href=\"#MJX-TEX-N-29\"/></g><g data-mml-node=\"mo\" transform=\"translate(5711.6, 0)\"><use xlink:href=\"#MJX-TEX-N-D7\"/></g><g data-mml-node=\"mo\" transform=\"translate(6767.3, 0)\"><text data-variant=\"normal\" transform=\"matrix(1 0 0 -1 0 0)\" font-size=\"884px\" font-family=\"serif\">项</text><text data-variant=\"normal\" transform=\"translate(900, 0) matrix(1 0 0 -1 0 0)\" font-size=\"884px\" font-family=\"serif\">数</text></g></g></g></g><g data-mml-node=\"mrow\" transform=\"translate(4253.7, -506) scale(0.707)\"><g data-mml-node=\"mpadded\"><g data-mml-node=\"mrow\"/></g><g data-mml-node=\"mstyle\" transform=\"scale(1.414)\"><g data-mml-node=\"TeXAtom\" data-mjx-texclass=\"ORD\"><g data-mml-node=\"mn\"><use xlink:href=\"#MJX-TEX-N-32\"/></g></g></g></g><rect width=\"8767.3\" height=\"60\" x=\"120\" y=\"220\"/></g></g></g></svg></mjx-container> 。可以用公式把每一个位置获得的总糖果数表示出来。我的方法稍微蠢了点,算了每一轮的总糖果数,其实可以直接求总共发了多少次糖果,除以每轮的人数就可以得出发了多少轮。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">distributeCandies</span><span class=\"params\">(self, candies: int, num_people: int)</span>:</span></span><br><span class=\"line\"> total = <span class=\"number\">0</span></span><br><span class=\"line\"> i = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"comment\"># import ipdb; ipdb.set_trace()</span></span><br><span class=\"line\"> <span class=\"keyword\">while</span> total &lt;= candies:</span><br><span class=\"line\"> t = (num_people*i)*num_people + int((<span class=\"number\">1</span>+num_people)*num_people/<span class=\"number\">2</span>)</span><br><span class=\"line\"> <span class=\"keyword\">if</span> total + t &lt;= candies:</span><br><span class=\"line\"> total += t</span><br><span class=\"line\"> i += <span class=\"number\">1</span></span><br><span class=\"line\"> <span class=\"keyword\">else</span>:</span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"> remaining = candies - total</span><br><span class=\"line\"> print(total, remaining, i)</span><br><span class=\"line\"> l = []</span><br><span class=\"line\"> <span class=\"keyword\">for</span> n <span class=\"keyword\">in</span> range(<span class=\"number\">1</span>, num_people+<span class=\"number\">1</span>):</span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> total:</span><br><span class=\"line\"> current_candy = n</span><br><span class=\"line\"> <span class=\"keyword\">else</span>:</span><br><span class=\"line\"> current_candy = n+i*num_people</span><br><span class=\"line\"></span><br><span class=\"line\"> n_count = int((<span class=\"number\">0</span>+(i<span class=\"number\">-1</span>))*(i)/<span class=\"number\">2</span>)</span><br><span class=\"line\"> print(current_candy, n_count)</span><br><span class=\"line\"> <span class=\"keyword\">if</span> remaining &gt;= current_candy:</span><br><span class=\"line\"> l.append(n_count*num_people + n*i + current_candy)</span><br><span class=\"line\"> remaining -= current_candy</span><br><span class=\"line\"> <span class=\"keyword\">else</span>:</span><br><span class=\"line\"> l.append(n_count*num_people + n*i + remaining)</span><br><span class=\"line\"> remaining = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> l</span><br><span class=\"line\"><span class=\"comment\"># 28 ms\t13.7 MB,</span></span><br></pre></td></tr></table></figure>\n<svg style=\"display: none\" id=\"MJX-SVG-global-cache\"><defs><path id=\"MJX-TEX-N-28\" d=\"M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z\"/><path id=\"MJX-TEX-N-2B\" d=\"M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z\"/><path id=\"MJX-TEX-N-29\" d=\"M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z\"/><path id=\"MJX-TEX-N-D7\" d=\"M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z\"/><path id=\"MJX-TEX-N-32\" d=\"M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z\"/></defs></svg>"},{"title":"leetcode-1160","date":"2020-03-31T16:18:48.000Z","_content":"\n\n### 1160. 拼写单词\n\n[题目](https://leetcode-cn.com/problems/find-words-that-can-be-formed-by-characters/)\n\n\n\n<!--more-->\n\n\n\n利用列表 remove 方法,检查 chars 中是否有足够的字母拼写 word\n\n```python\nclass Solution:\n def countCharacters(self, words, chars: str) -> int:\n\n words_ = ''\n for w in words:\n lchars = list(chars)\n try:\n for l in w:\n lchars.remove(l)\n except:\n continue\n words_ += w\n\n return len(words_)\n# 152 ms\t14.1 MB\n```\n\n","source":"_posts/2020-04-01-leetcode-1160.md","raw":"---\ntitle: leetcode-1160\ndate: 2020-04-01 00:18:48\ntags:\ncategories: leetcode\n---\n\n\n### 1160. 拼写单词\n\n[题目](https://leetcode-cn.com/problems/find-words-that-can-be-formed-by-characters/)\n\n\n\n<!--more-->\n\n\n\n利用列表 remove 方法,检查 chars 中是否有足够的字母拼写 word\n\n```python\nclass Solution:\n def countCharacters(self, words, chars: str) -> int:\n\n words_ = ''\n for w in words:\n lchars = list(chars)\n try:\n for l in w:\n lchars.remove(l)\n except:\n continue\n words_ += w\n\n return len(words_)\n# 152 ms\t14.1 MB\n```\n\n","slug":"leetcode-1160","published":1,"updated":"2020-04-01T07:57:06.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4r000psubu38qpnnv7","content":"<h3 id=\"1160-__u62FC_u5199_u5355_u8BCD\"><a href=\"#1160-__u62FC_u5199_u5355_u8BCD\" class=\"headerlink\" title=\"1160. 拼写单词\"></a>1160. 拼写单词</h3><p><a href=\"https://leetcode-cn.com/problems/find-words-that-can-be-formed-by-characters/\" target=\"_blank\" rel=\"noopener\">题目</a></p>\n<a id=\"more\"></a>\n<p>利用列表 remove 方法,检查 chars 中是否有足够的字母拼写 word</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">countCharacters</span><span class=\"params\">(self, words, chars: str)</span> -&gt; int:</span></span><br><span class=\"line\"></span><br><span class=\"line\"> words_ = <span class=\"string\">''</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> w <span class=\"keyword\">in</span> words:</span><br><span class=\"line\"> lchars = list(chars)</span><br><span class=\"line\"> <span class=\"keyword\">try</span>:</span><br><span class=\"line\"> <span class=\"keyword\">for</span> l <span class=\"keyword\">in</span> w:</span><br><span class=\"line\"> lchars.remove(l)</span><br><span class=\"line\"> <span class=\"keyword\">except</span>:</span><br><span class=\"line\"> <span class=\"keyword\">continue</span></span><br><span class=\"line\"> words_ += w</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"keyword\">return</span> len(words_)</span><br><span class=\"line\"><span class=\"comment\"># 152 ms\t14.1 MB</span></span><br></pre></td></tr></table></figure>\n","site":{"data":{}},"excerpt":"<h3 id=\"1160-__u62FC_u5199_u5355_u8BCD\"><a href=\"#1160-__u62FC_u5199_u5355_u8BCD\" class=\"headerlink\" title=\"1160. 拼写单词\"></a>1160. 拼写单词</h3><p><a href=\"https://leetcode-cn.com/problems/find-words-that-can-be-formed-by-characters/\" target=\"_blank\" rel=\"noopener\">题目</a></p>","more":"<p>利用列表 remove 方法,检查 chars 中是否有足够的字母拼写 word</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">countCharacters</span><span class=\"params\">(self, words, chars: str)</span> -&gt; int:</span></span><br><span class=\"line\"></span><br><span class=\"line\"> words_ = <span class=\"string\">''</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> w <span class=\"keyword\">in</span> words:</span><br><span class=\"line\"> lchars = list(chars)</span><br><span class=\"line\"> <span class=\"keyword\">try</span>:</span><br><span class=\"line\"> <span class=\"keyword\">for</span> l <span class=\"keyword\">in</span> w:</span><br><span class=\"line\"> lchars.remove(l)</span><br><span class=\"line\"> <span class=\"keyword\">except</span>:</span><br><span class=\"line\"> <span class=\"keyword\">continue</span></span><br><span class=\"line\"> words_ += w</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"keyword\">return</span> len(words_)</span><br><span class=\"line\"><span class=\"comment\"># 152 ms\t14.1 MB</span></span><br></pre></td></tr></table></figure>"},{"title":"leetcode-compress-string-lcci","date":"2020-04-01T07:51:22.000Z","_content":"\n### 面试题 01.06. 字符串压缩\n\n[题目](https://leetcode-cn.com/problems/compress-string-lcci/)\n\n<!--more-->\n\n\n\n遍历一遍字符串遇到跟上一个字符不同的字符时记录上一个字符的重复长度。\n\n\n\n```python\nclass Solution:\n def compressString(self, S: str) -> str:\n if not S:\n return S\n c = ''\n prev = S[0]\n p_len = 1\n for w in S[1:]:\n if w != prev:\n c += '%s%s' % (prev, p_len)\n prev = w\n p_len = 1\n else:\n p_len += 1\n c += '%s%s' % (prev, p_len)\n if len(S) > len(c):\n return c\n return S\n# 52 ms\t13.8 MB\n```\n\n","source":"_posts/2020-04-01-leetcode-compress-string-lcci.md","raw":"---\ntitle: leetcode-compress-string-lcci\ndate: 2020-04-01 15:51:22\ntags:\ncategories: leetcode\n---\n\n### 面试题 01.06. 字符串压缩\n\n[题目](https://leetcode-cn.com/problems/compress-string-lcci/)\n\n<!--more-->\n\n\n\n遍历一遍字符串遇到跟上一个字符不同的字符时记录上一个字符的重复长度。\n\n\n\n```python\nclass Solution:\n def compressString(self, S: str) -> str:\n if not S:\n return S\n c = ''\n prev = S[0]\n p_len = 1\n for w in S[1:]:\n if w != prev:\n c += '%s%s' % (prev, p_len)\n prev = w\n p_len = 1\n else:\n p_len += 1\n c += '%s%s' % (prev, p_len)\n if len(S) > len(c):\n return c\n return S\n# 52 ms\t13.8 MB\n```\n\n","slug":"leetcode-compress-string-lcci","published":1,"updated":"2020-04-01T07:57:26.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4s000rsubusdeyspgy","content":"<h3 id=\"u9762_u8BD5_u9898_01-06-__u5B57_u7B26_u4E32_u538B_u7F29\"><a href=\"#u9762_u8BD5_u9898_01-06-__u5B57_u7B26_u4E32_u538B_u7F29\" class=\"headerlink\" title=\"面试题 01.06. 字符串压缩\"></a>面试题 01.06. 字符串压缩</h3><p><a href=\"https://leetcode-cn.com/problems/compress-string-lcci/\" target=\"_blank\" rel=\"noopener\">题目</a></p>\n<a id=\"more\"></a>\n<p>遍历一遍字符串,遇到跟上一个字符不同的字符时记录上一个字符的重复长度。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">compressString</span><span class=\"params\">(self, S: str)</span> -&gt; str:</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> S:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> S</span><br><span class=\"line\"> c = <span class=\"string\">''</span></span><br><span class=\"line\"> prev = S[<span class=\"number\">0</span>]</span><br><span class=\"line\"> p_len = <span class=\"number\">1</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> w <span class=\"keyword\">in</span> S[<span class=\"number\">1</span>:]:</span><br><span class=\"line\"> <span class=\"keyword\">if</span> w != prev:</span><br><span class=\"line\"> c += <span class=\"string\">'%s%s'</span> % (prev, p_len)</span><br><span class=\"line\"> prev = w</span><br><span class=\"line\"> p_len = <span class=\"number\">1</span></span><br><span class=\"line\"> <span class=\"keyword\">else</span>:</span><br><span class=\"line\"> p_len += <span class=\"number\">1</span></span><br><span class=\"line\"> c += <span class=\"string\">'%s%s'</span> % (prev, p_len)</span><br><span class=\"line\"> <span class=\"keyword\">if</span> len(S) &gt; len(c):</span><br><span class=\"line\"> <span class=\"keyword\">return</span> c</span><br><span class=\"line\"> <span class=\"keyword\">return</span> S</span><br><span class=\"line\"><span class=\"comment\"># 52 ms\t13.8 MB</span></span><br></pre></td></tr></table></figure>\n","site":{"data":{}},"excerpt":"<h3 id=\"u9762_u8BD5_u9898_01-06-__u5B57_u7B26_u4E32_u538B_u7F29\"><a href=\"#u9762_u8BD5_u9898_01-06-__u5B57_u7B26_u4E32_u538B_u7F29\" class=\"headerlink\" title=\"面试题 01.06. 字符串压缩\"></a>面试题 01.06. 字符串压缩</h3><p><a href=\"https://leetcode-cn.com/problems/compress-string-lcci/\" target=\"_blank\" rel=\"noopener\">题目</a></p>","more":"<p>遍历一遍字符串,遇到跟上一个字符不同的字符时记录上一个字符的重复长度。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">compressString</span><span class=\"params\">(self, S: str)</span> -&gt; str:</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> S:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> S</span><br><span class=\"line\"> c = <span class=\"string\">''</span></span><br><span class=\"line\"> prev = S[<span class=\"number\">0</span>]</span><br><span class=\"line\"> p_len = <span class=\"number\">1</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> w <span class=\"keyword\">in</span> S[<span class=\"number\">1</span>:]:</span><br><span class=\"line\"> <span class=\"keyword\">if</span> w != prev:</span><br><span class=\"line\"> c += <span class=\"string\">'%s%s'</span> % (prev, p_len)</span><br><span class=\"line\"> prev = w</span><br><span class=\"line\"> p_len = <span class=\"number\">1</span></span><br><span class=\"line\"> <span class=\"keyword\">else</span>:</span><br><span class=\"line\"> p_len += <span class=\"number\">1</span></span><br><span class=\"line\"> c += <span class=\"string\">'%s%s'</span> % (prev, p_len)</span><br><span class=\"line\"> <span class=\"keyword\">if</span> len(S) &gt; len(c):</span><br><span class=\"line\"> <span class=\"keyword\">return</span> c</span><br><span class=\"line\"> <span class=\"keyword\">return</span> S</span><br><span class=\"line\"><span class=\"comment\"># 52 ms\t13.8 MB</span></span><br></pre></td></tr></table></figure>"},{"title":"leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof","date":"2020-04-09T14:14:56.000Z","mathjax":true,"_content":"\n### 面试题57 - II. 和为s的连续正数序列\n\n[题目](https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/)\n\n\n\n<!--more-->\n\n\n\n又是小学奥数。由等差数列求和公式$\\cfrac{(首项 + 末项)×项数}{2}$ 可知,当首项为 1 的时候项数最多,又由于是连续正整数,$n^2 < (1+n)×n < (n+1)^2 $,那最大的 $n$ 就不大于 $\\sqrt{2×target} + 1$。\n\n由小到大遍历 $n$,可以求得首项。\n\n```python\nimport math\nclass Solution:\n def findContinuousSequence(self, target: int):\n n = int(math.sqrt(2 * target) + 1)\n if n < 2:\n return []\n sum_list = []\n a = 0\n for i in range(2, n+1):\n a = ((2 * target) / i + 1 - i) / 2\n if a and not a % 1:\n a = int(a)\n s_ = []\n for j in range(0, i):\n s_.append(a + j)\n sum_list.append(s_)\n return sorted(sum_list)\n # 60 ms\t13.7 MB\n```\n","source":"_posts/2020-04-09-leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof.md","raw":"---\ntitle: leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof\ndate: 2020-04-09 22:14:56\ntags:\ncategories: leetcode\nmathjax: true\n---\n\n### 面试题57 - II. 和为s的连续正数序列\n\n[题目](https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/)\n\n\n\n<!--more-->\n\n\n\n又是小学奥数。由等差数列求和公式$\\cfrac{(首项 + 末项)×项数}{2}$ 可知,当首项为 1 的时候项数最多,又由于是连续正整数,$n^2 < (1+n)×n < (n+1)^2 $,那最大的 $n$ 就不大于 $\\sqrt{2×target} + 1$。\n\n由小到大遍历 $n$,可以求得首项。\n\n```python\nimport math\nclass Solution:\n def findContinuousSequence(self, target: int):\n n = int(math.sqrt(2 * target) + 1)\n if n < 2:\n return []\n sum_list = []\n a = 0\n for i in range(2, n+1):\n a = ((2 * target) / i + 1 - i) / 2\n if a and not a % 1:\n a = int(a)\n s_ = []\n for j in range(0, i):\n s_.append(a + j)\n sum_list.append(s_)\n return sorted(sum_list)\n # 60 ms\t13.7 MB\n```\n","slug":"leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof","published":1,"updated":"2020-04-14T15:29:40.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4t000tsubuyl29244j","content":"<h3 id=\"u9762_u8BD5_u989857_-_II-__u548C_u4E3As_u7684_u8FDE_u7EED_u6B63_u6570_u5E8F_u5217\"><a href=\"#u9762_u8BD5_u989857_-_II-__u548C_u4E3As_u7684_u8FDE_u7EED_u6B63_u6570_u5E8F_u5217\" class=\"headerlink\" title=\"面试题57 - II. 和为s的连续正数序列\"></a>面试题57 - II. 和为s的连续正数序列</h3><p><a href=\"https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/\" target=\"_blank\" rel=\"noopener\">题目</a></p>\n<a id=\"more\"></a>\n<p>又是小学奥数。由等差数列求和公式<mjx-container class=\"MathJax\" jax=\"SVG\"><svg style=\"vertical-align: -1.625ex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20.379ex\" height=\"4.656ex\" role=\"img\" focusable=\"false\" viewbox=\"0 -1340 9007.3 2058.1\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"matrix(1 0 0 -1 0 0)\"><g data-mml-node=\"math\"><g data-mml-node=\"mfrac\"><g data-mml-node=\"mrow\" transform=\"translate(220, 590) scale(0.707)\"><g data-mml-node=\"mpadded\"><g data-mml-node=\"mrow\"/></g><g data-mml-node=\"mstyle\" transform=\"scale(1.414)\"><g data-mml-node=\"TeXAtom\" data-mjx-texclass=\"ORD\"><g data-mml-node=\"mo\"><use xlink:href=\"#MJX-TEX-N-28\"/></g><g data-mml-node=\"mo\" transform=\"translate(389, 0)\"><text data-variant=\"normal\" transform=\"matrix(1 0 0 -1 0 0)\" font-size=\"884px\" font-family=\"serif\">首</text><text data-variant=\"normal\" transform=\"translate(900, 0) matrix(1 0 0 -1 0 0)\" font-size=\"884px\" font-family=\"serif\">项</text></g><g data-mml-node=\"mo\" transform=\"translate(2466.8, 0)\"><use xlink:href=\"#MJX-TEX-N-2B\"/></g><g data-mml-node=\"mo\" transform=\"translate(3522.6, 0)\"><text data-variant=\"normal\" transform=\"matrix(1 0 0 -1 0 0)\" font-size=\"884px\" font-family=\"serif\">末</text><text data-variant=\"normal\" transform=\"translate(900, 0) matrix(1 0 0 -1 0 0)\" font-size=\"884px\" font-family=\"serif\">项</text></g><g data-mml-node=\"mo\" transform=\"translate(5322.6, 0)\"><use xlink:href=\"#MJX-TEX-N-29\"/></g><g data-mml-node=\"mo\" transform=\"translate(5711.6, 0)\"><use xlink:href=\"#MJX-TEX-N-D7\"/></g><g data-mml-node=\"mo\" transform=\"translate(6767.3, 0)\"><text data-variant=\"normal\" transform=\"matrix(1 0 0 -1 0 0)\" font-size=\"884px\" font-family=\"serif\">项</text><text data-variant=\"normal\" transform=\"translate(900, 0) matrix(1 0 0 -1 0 0)\" font-size=\"884px\" font-family=\"serif\">数</text></g></g></g></g><g data-mml-node=\"mrow\" transform=\"translate(4253.7, -506) scale(0.707)\"><g data-mml-node=\"mpadded\"><g data-mml-node=\"mrow\"/></g><g data-mml-node=\"mstyle\" transform=\"scale(1.414)\"><g data-mml-node=\"TeXAtom\" data-mjx-texclass=\"ORD\"><g data-mml-node=\"mn\"><use xlink:href=\"#MJX-TEX-N-32\"/></g></g></g></g><rect width=\"8767.3\" height=\"60\" x=\"120\" y=\"220\"/></g></g></g></svg></mjx-container> 可知,当首项为 1 的时候项数最多,又由于是连续正整数,<mjx-container class=\"MathJax\" jax=\"SVG\"><svg style=\"vertical-align: -0.566ex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"27.37ex\" height=\"2.452ex\" role=\"img\" focusable=\"false\" viewbox=\"0 -833.9 12097.6 1083.9\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"matrix(1 0 0 -1 0 0)\"><g data-mml-node=\"math\"><g data-mml-node=\"msup\"><g data-mml-node=\"mi\"><use xlink:href=\"#MJX-TEX-I-6E\"/></g><g data-mml-node=\"mn\" transform=\"translate(600, 363) scale(0.707)\"><use xlink:href=\"#MJX-TEX-N-32\"/></g></g><g data-mml-node=\"mo\" transform=\"translate(1281.3, 0)\"><use xlink:href=\"#MJX-TEX-N-3C\"/></g><g data-mml-node=\"mo\" transform=\"translate(2337.1, 0)\"><use xlink:href=\"#MJX-TEX-N-28\"/></g><g data-mml-node=\"mn\" transform=\"translate(2726.1, 0)\"><use xlink:href=\"#MJX-TEX-N-31\"/></g><g data-mml-node=\"mo\" transform=\"translate(3448.3, 0)\"><use xlink:href=\"#MJX-TEX-N-2B\"/></g><g data-mml-node=\"mi\" transform=\"translate(4448.6, 0)\"><use xlink:href=\"#MJX-TEX-I-6E\"/></g><g data-mml-node=\"mo\" transform=\"translate(5048.6, 0)\"><use xlink:href=\"#MJX-TEX-N-29\"/></g><g data-mml-node=\"mo\" transform=\"translate(5659.8, 0)\"><use xlink:href=\"#MJX-TEX-N-D7\"/></g><g data-mml-node=\"mi\" transform=\"translate(6660, 0)\"><use xlink:href=\"#MJX-TEX-I-6E\"/></g><g data-mml-node=\"mo\" transform=\"translate(7537.8, 0)\"><use xlink:href=\"#MJX-TEX-N-3C\"/></g><g data-mml-node=\"mo\" transform=\"translate(8593.6, 0)\"><use xlink:href=\"#MJX-TEX-N-28\"/></g><g data-mml-node=\"mi\" transform=\"translate(8982.6, 0)\"><use xlink:href=\"#MJX-TEX-I-6E\"/></g><g data-mml-node=\"mo\" transform=\"translate(9804.8, 0)\"><use xlink:href=\"#MJX-TEX-N-2B\"/></g><g data-mml-node=\"mn\" transform=\"translate(10805, 0)\"><use xlink:href=\"#MJX-TEX-N-31\"/></g><g data-mml-node=\"msup\" transform=\"translate(11305, 0)\"><g data-mml-node=\"mo\"><use xlink:href=\"#MJX-TEX-N-29\"/></g><g data-mml-node=\"mn\" transform=\"translate(389, 363) scale(0.707)\"><use xlink:href=\"#MJX-TEX-N-32\"/></g></g></g></g></svg></mjx-container>,那最大的 <mjx-container class=\"MathJax\" jax=\"SVG\"><svg style=\"vertical-align: -0.025ex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"1.357ex\" height=\"1.025ex\" role=\"img\" focusable=\"false\" viewbox=\"0 -442 600 453\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"matrix(1 0 0 -1 0 0)\"><g data-mml-node=\"math\"><g data-mml-node=\"mi\"><use xlink:href=\"#MJX-TEX-I-6E\"/></g></g></g></svg></mjx-container> 就不大于 <mjx-container class=\"MathJax\" jax=\"SVG\"><svg style=\"vertical-align: -0.683ex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16.086ex\" height=\"2.851ex\" role=\"img\" focusable=\"false\" viewbox=\"0 -958 7109.9 1260\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"matrix(1 0 0 -1 0 0)\"><g data-mml-node=\"math\"><g data-mml-node=\"msqrt\"><g transform=\"translate(1020, 0)\"><g data-mml-node=\"mn\"><use xlink:href=\"#MJX-TEX-N-32\"/></g><g data-mml-node=\"mo\" transform=\"translate(722.2, 0)\"><use xlink:href=\"#MJX-TEX-N-D7\"/></g><g data-mml-node=\"mi\" transform=\"translate(1722.4, 0)\"><use xlink:href=\"#MJX-TEX-I-74\"/></g><g data-mml-node=\"mi\" transform=\"translate(2083.4, 0)\"><use xlink:href=\"#MJX-TEX-I-61\"/></g><g data-mml-node=\"mi\" transform=\"translate(2612.4, 0)\"><use xlink:href=\"#MJX-TEX-I-72\"/></g><g data-mml-node=\"mi\" transform=\"translate(3063.4, 0)\"><use xlink:href=\"#MJX-TEX-I-67\"/></g><g data-mml-node=\"mi\" transform=\"translate(3540.4, 0)\"><use xlink:href=\"#MJX-TEX-I-65\"/></g><g data-mml-node=\"mi\" transform=\"translate(4006.4, 0)\"><use xlink:href=\"#MJX-TEX-I-74\"/></g></g><g data-mml-node=\"mo\" transform=\"translate(0, 48)\"><use xlink:href=\"#MJX-TEX-SO-221A\"/></g><rect width=\"4367.4\" height=\"60\" x=\"1020\" y=\"838\"/></g><g data-mml-node=\"mo\" transform=\"translate(5609.7, 0)\"><use xlink:href=\"#MJX-TEX-N-2B\"/></g><g data-mml-node=\"mn\" transform=\"translate(6609.9, 0)\"><use xlink:href=\"#MJX-TEX-N-31\"/></g></g></g></svg></mjx-container>。</p>\n<p>由小到大遍历 <mjx-container class=\"MathJax\" jax=\"SVG\"><svg style=\"vertical-align: -0.025ex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"1.357ex\" height=\"1.025ex\" role=\"img\" focusable=\"false\" viewbox=\"0 -442 600 453\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"matrix(1 0 0 -1 0 0)\"><g data-mml-node=\"math\"><g data-mml-node=\"mi\"><use xlink:href=\"#MJX-TEX-I-6E\"/></g></g></g></svg></mjx-container>,可以求得首项。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">import</span> math</span><br><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">findContinuousSequence</span><span class=\"params\">(self, target: int)</span>:</span></span><br><span class=\"line\"> n = int(math.sqrt(<span class=\"number\">2</span> * target) + <span class=\"number\">1</span>)</span><br><span class=\"line\"> <span class=\"keyword\">if</span> n &lt; <span class=\"number\">2</span>:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> []</span><br><span class=\"line\"> sum_list = []</span><br><span class=\"line\"> a = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> i <span class=\"keyword\">in</span> range(<span class=\"number\">2</span>, n+<span class=\"number\">1</span>):</span><br><span class=\"line\"> a = ((<span class=\"number\">2</span> * target) / i + <span class=\"number\">1</span> - i) / <span class=\"number\">2</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> a <span class=\"keyword\">and</span> <span class=\"keyword\">not</span> a % <span class=\"number\">1</span>:</span><br><span class=\"line\"> a = int(a)</span><br><span class=\"line\"> s_ = []</span><br><span class=\"line\"> <span class=\"keyword\">for</span> j <span class=\"keyword\">in</span> range(<span class=\"number\">0</span>, i):</span><br><span class=\"line\"> s_.append(a + j)</span><br><span class=\"line\"> sum_list.append(s_)</span><br><span class=\"line\"> <span class=\"keyword\">return</span> sorted(sum_list)</span><br><span class=\"line\"> <span class=\"comment\"># 60 ms\t13.7 MB</span></span><br></pre></td></tr></table></figure>\n<svg style=\"display: none\" id=\"MJX-SVG-global-cache\"><defs><path id=\"MJX-TEX-N-28\" d=\"M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z\"/><path id=\"MJX-TEX-N-2B\" d=\"M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z\"/><path id=\"MJX-TEX-N-29\" d=\"M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z\"/><path id=\"MJX-TEX-N-D7\" d=\"M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z\"/><path id=\"MJX-TEX-N-32\" d=\"M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z\"/><path id=\"MJX-TEX-I-6E\" d=\"M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z\"/><path id=\"MJX-TEX-N-3C\" d=\"M694 -11T694 -19T688 -33T678 -40Q671 -40 524 29T234 166L90 235Q83 240 83 250Q83 261 91 266Q664 540 678 540Q681 540 687 534T694 519T687 505Q686 504 417 376L151 250L417 124Q686 -4 687 -5Q694 -11 694 -19Z\"/><path id=\"MJX-TEX-N-31\" d=\"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z\"/><path id=\"MJX-TEX-SO-221A\" d=\"M263 249Q264 249 315 130T417 -108T470 -228L725 302Q981 837 982 839Q989 850 1001 850Q1008 850 1013 844T1020 832V826L741 243Q645 43 540 -176Q479 -303 469 -324T453 -348Q449 -350 436 -350L424 -349L315 -96Q206 156 205 156L171 130Q138 104 137 104L111 130L263 249Z\"/><path id=\"MJX-TEX-I-74\" d=\"M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z\"/><path id=\"MJX-TEX-I-61\" d=\"M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z\"/><path id=\"MJX-TEX-I-72\" d=\"M21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q161 442 183 430T214 408T225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400Q430 381 430 363Q430 333 417 315T391 292T366 288Q346 288 334 299T322 328Q322 376 378 392Q356 405 342 405Q286 405 239 331Q229 315 224 298T190 165Q156 25 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287Z\"/><path id=\"MJX-TEX-I-67\" d=\"M311 43Q296 30 267 15T206 0Q143 0 105 45T66 160Q66 265 143 353T314 442Q361 442 401 394L404 398Q406 401 409 404T418 412T431 419T447 422Q461 422 470 413T480 394Q480 379 423 152T363 -80Q345 -134 286 -169T151 -205Q10 -205 10 -137Q10 -111 28 -91T74 -71Q89 -71 102 -80T116 -111Q116 -121 114 -130T107 -144T99 -154T92 -162L90 -164H91Q101 -167 151 -167Q189 -167 211 -155Q234 -144 254 -122T282 -75Q288 -56 298 -13Q311 35 311 43ZM384 328L380 339Q377 350 375 354T369 368T359 382T346 393T328 402T306 405Q262 405 221 352Q191 313 171 233T151 117Q151 38 213 38Q269 38 323 108L331 118L384 328Z\"/><path id=\"MJX-TEX-I-65\" d=\"M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z\"/></defs></svg>","site":{"data":{}},"excerpt":"<h3 id=\"u9762_u8BD5_u989857_-_II-__u548C_u4E3As_u7684_u8FDE_u7EED_u6B63_u6570_u5E8F_u5217\"><a href=\"#u9762_u8BD5_u989857_-_II-__u548C_u4E3As_u7684_u8FDE_u7EED_u6B63_u6570_u5E8F_u5217\" class=\"headerlink\" title=\"面试题57 - II. 和为s的连续正数序列\"></a>面试题57 - II. 和为s的连续正数序列</h3><p><a href=\"https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/\" target=\"_blank\" rel=\"noopener\">题目</a></p>","more":"<p>又是小学奥数。由等差数列求和公式<mjx-container class=\"MathJax\" jax=\"SVG\"><svg style=\"vertical-align: -1.625ex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20.379ex\" height=\"4.656ex\" role=\"img\" focusable=\"false\" viewbox=\"0 -1340 9007.3 2058.1\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"matrix(1 0 0 -1 0 0)\"><g data-mml-node=\"math\"><g data-mml-node=\"mfrac\"><g data-mml-node=\"mrow\" transform=\"translate(220, 590) scale(0.707)\"><g data-mml-node=\"mpadded\"><g data-mml-node=\"mrow\"/></g><g data-mml-node=\"mstyle\" transform=\"scale(1.414)\"><g data-mml-node=\"TeXAtom\" data-mjx-texclass=\"ORD\"><g data-mml-node=\"mo\"><use xlink:href=\"#MJX-TEX-N-28\"/></g><g data-mml-node=\"mo\" transform=\"translate(389, 0)\"><text data-variant=\"normal\" transform=\"matrix(1 0 0 -1 0 0)\" font-size=\"884px\" font-family=\"serif\">首</text><text data-variant=\"normal\" transform=\"translate(900, 0) matrix(1 0 0 -1 0 0)\" font-size=\"884px\" font-family=\"serif\">项</text></g><g data-mml-node=\"mo\" transform=\"translate(2466.8, 0)\"><use xlink:href=\"#MJX-TEX-N-2B\"/></g><g data-mml-node=\"mo\" transform=\"translate(3522.6, 0)\"><text data-variant=\"normal\" transform=\"matrix(1 0 0 -1 0 0)\" font-size=\"884px\" font-family=\"serif\">末</text><text data-variant=\"normal\" transform=\"translate(900, 0) matrix(1 0 0 -1 0 0)\" font-size=\"884px\" font-family=\"serif\">项</text></g><g data-mml-node=\"mo\" transform=\"translate(5322.6, 0)\"><use xlink:href=\"#MJX-TEX-N-29\"/></g><g data-mml-node=\"mo\" transform=\"translate(5711.6, 0)\"><use xlink:href=\"#MJX-TEX-N-D7\"/></g><g data-mml-node=\"mo\" transform=\"translate(6767.3, 0)\"><text data-variant=\"normal\" transform=\"matrix(1 0 0 -1 0 0)\" font-size=\"884px\" font-family=\"serif\">项</text><text data-variant=\"normal\" transform=\"translate(900, 0) matrix(1 0 0 -1 0 0)\" font-size=\"884px\" font-family=\"serif\">数</text></g></g></g></g><g data-mml-node=\"mrow\" transform=\"translate(4253.7, -506) scale(0.707)\"><g data-mml-node=\"mpadded\"><g data-mml-node=\"mrow\"/></g><g data-mml-node=\"mstyle\" transform=\"scale(1.414)\"><g data-mml-node=\"TeXAtom\" data-mjx-texclass=\"ORD\"><g data-mml-node=\"mn\"><use xlink:href=\"#MJX-TEX-N-32\"/></g></g></g></g><rect width=\"8767.3\" height=\"60\" x=\"120\" y=\"220\"/></g></g></g></svg></mjx-container> 可知,当首项为 1 的时候项数最多,又由于是连续正整数,<mjx-container class=\"MathJax\" jax=\"SVG\"><svg style=\"vertical-align: -0.566ex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"27.37ex\" height=\"2.452ex\" role=\"img\" focusable=\"false\" viewbox=\"0 -833.9 12097.6 1083.9\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"matrix(1 0 0 -1 0 0)\"><g data-mml-node=\"math\"><g data-mml-node=\"msup\"><g data-mml-node=\"mi\"><use xlink:href=\"#MJX-TEX-I-6E\"/></g><g data-mml-node=\"mn\" transform=\"translate(600, 363) scale(0.707)\"><use xlink:href=\"#MJX-TEX-N-32\"/></g></g><g data-mml-node=\"mo\" transform=\"translate(1281.3, 0)\"><use xlink:href=\"#MJX-TEX-N-3C\"/></g><g data-mml-node=\"mo\" transform=\"translate(2337.1, 0)\"><use xlink:href=\"#MJX-TEX-N-28\"/></g><g data-mml-node=\"mn\" transform=\"translate(2726.1, 0)\"><use xlink:href=\"#MJX-TEX-N-31\"/></g><g data-mml-node=\"mo\" transform=\"translate(3448.3, 0)\"><use xlink:href=\"#MJX-TEX-N-2B\"/></g><g data-mml-node=\"mi\" transform=\"translate(4448.6, 0)\"><use xlink:href=\"#MJX-TEX-I-6E\"/></g><g data-mml-node=\"mo\" transform=\"translate(5048.6, 0)\"><use xlink:href=\"#MJX-TEX-N-29\"/></g><g data-mml-node=\"mo\" transform=\"translate(5659.8, 0)\"><use xlink:href=\"#MJX-TEX-N-D7\"/></g><g data-mml-node=\"mi\" transform=\"translate(6660, 0)\"><use xlink:href=\"#MJX-TEX-I-6E\"/></g><g data-mml-node=\"mo\" transform=\"translate(7537.8, 0)\"><use xlink:href=\"#MJX-TEX-N-3C\"/></g><g data-mml-node=\"mo\" transform=\"translate(8593.6, 0)\"><use xlink:href=\"#MJX-TEX-N-28\"/></g><g data-mml-node=\"mi\" transform=\"translate(8982.6, 0)\"><use xlink:href=\"#MJX-TEX-I-6E\"/></g><g data-mml-node=\"mo\" transform=\"translate(9804.8, 0)\"><use xlink:href=\"#MJX-TEX-N-2B\"/></g><g data-mml-node=\"mn\" transform=\"translate(10805, 0)\"><use xlink:href=\"#MJX-TEX-N-31\"/></g><g data-mml-node=\"msup\" transform=\"translate(11305, 0)\"><g data-mml-node=\"mo\"><use xlink:href=\"#MJX-TEX-N-29\"/></g><g data-mml-node=\"mn\" transform=\"translate(389, 363) scale(0.707)\"><use xlink:href=\"#MJX-TEX-N-32\"/></g></g></g></g></svg></mjx-container>,那最大的 <mjx-container class=\"MathJax\" jax=\"SVG\"><svg style=\"vertical-align: -0.025ex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"1.357ex\" height=\"1.025ex\" role=\"img\" focusable=\"false\" viewbox=\"0 -442 600 453\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"matrix(1 0 0 -1 0 0)\"><g data-mml-node=\"math\"><g data-mml-node=\"mi\"><use xlink:href=\"#MJX-TEX-I-6E\"/></g></g></g></svg></mjx-container> 就不大于 <mjx-container class=\"MathJax\" jax=\"SVG\"><svg style=\"vertical-align: -0.683ex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16.086ex\" height=\"2.851ex\" role=\"img\" focusable=\"false\" viewbox=\"0 -958 7109.9 1260\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"matrix(1 0 0 -1 0 0)\"><g data-mml-node=\"math\"><g data-mml-node=\"msqrt\"><g transform=\"translate(1020, 0)\"><g data-mml-node=\"mn\"><use xlink:href=\"#MJX-TEX-N-32\"/></g><g data-mml-node=\"mo\" transform=\"translate(722.2, 0)\"><use xlink:href=\"#MJX-TEX-N-D7\"/></g><g data-mml-node=\"mi\" transform=\"translate(1722.4, 0)\"><use xlink:href=\"#MJX-TEX-I-74\"/></g><g data-mml-node=\"mi\" transform=\"translate(2083.4, 0)\"><use xlink:href=\"#MJX-TEX-I-61\"/></g><g data-mml-node=\"mi\" transform=\"translate(2612.4, 0)\"><use xlink:href=\"#MJX-TEX-I-72\"/></g><g data-mml-node=\"mi\" transform=\"translate(3063.4, 0)\"><use xlink:href=\"#MJX-TEX-I-67\"/></g><g data-mml-node=\"mi\" transform=\"translate(3540.4, 0)\"><use xlink:href=\"#MJX-TEX-I-65\"/></g><g data-mml-node=\"mi\" transform=\"translate(4006.4, 0)\"><use xlink:href=\"#MJX-TEX-I-74\"/></g></g><g data-mml-node=\"mo\" transform=\"translate(0, 48)\"><use xlink:href=\"#MJX-TEX-SO-221A\"/></g><rect width=\"4367.4\" height=\"60\" x=\"1020\" y=\"838\"/></g><g data-mml-node=\"mo\" transform=\"translate(5609.7, 0)\"><use xlink:href=\"#MJX-TEX-N-2B\"/></g><g data-mml-node=\"mn\" transform=\"translate(6609.9, 0)\"><use xlink:href=\"#MJX-TEX-N-31\"/></g></g></g></svg></mjx-container>。</p>\n<p>由小到大遍历 <mjx-container class=\"MathJax\" jax=\"SVG\"><svg style=\"vertical-align: -0.025ex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"1.357ex\" height=\"1.025ex\" role=\"img\" focusable=\"false\" viewbox=\"0 -442 600 453\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"matrix(1 0 0 -1 0 0)\"><g data-mml-node=\"math\"><g data-mml-node=\"mi\"><use xlink:href=\"#MJX-TEX-I-6E\"/></g></g></g></svg></mjx-container>,可以求得首项。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">import</span> math</span><br><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">findContinuousSequence</span><span class=\"params\">(self, target: int)</span>:</span></span><br><span class=\"line\"> n = int(math.sqrt(<span class=\"number\">2</span> * target) + <span class=\"number\">1</span>)</span><br><span class=\"line\"> <span class=\"keyword\">if</span> n &lt; <span class=\"number\">2</span>:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> []</span><br><span class=\"line\"> sum_list = []</span><br><span class=\"line\"> a = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> i <span class=\"keyword\">in</span> range(<span class=\"number\">2</span>, n+<span class=\"number\">1</span>):</span><br><span class=\"line\"> a = ((<span class=\"number\">2</span> * target) / i + <span class=\"number\">1</span> - i) / <span class=\"number\">2</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> a <span class=\"keyword\">and</span> <span class=\"keyword\">not</span> a % <span class=\"number\">1</span>:</span><br><span class=\"line\"> a = int(a)</span><br><span class=\"line\"> s_ = []</span><br><span class=\"line\"> <span class=\"keyword\">for</span> j <span class=\"keyword\">in</span> range(<span class=\"number\">0</span>, i):</span><br><span class=\"line\"> s_.append(a + j)</span><br><span class=\"line\"> sum_list.append(s_)</span><br><span class=\"line\"> <span class=\"keyword\">return</span> sorted(sum_list)</span><br><span class=\"line\"> <span class=\"comment\"># 60 ms\t13.7 MB</span></span><br></pre></td></tr></table></figure>\n<svg style=\"display: none\" id=\"MJX-SVG-global-cache\"><defs><path id=\"MJX-TEX-N-28\" d=\"M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z\"/><path id=\"MJX-TEX-N-2B\" d=\"M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z\"/><path id=\"MJX-TEX-N-29\" d=\"M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z\"/><path id=\"MJX-TEX-N-D7\" d=\"M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z\"/><path id=\"MJX-TEX-N-32\" d=\"M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z\"/><path id=\"MJX-TEX-I-6E\" d=\"M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z\"/><path id=\"MJX-TEX-N-3C\" d=\"M694 -11T694 -19T688 -33T678 -40Q671 -40 524 29T234 166L90 235Q83 240 83 250Q83 261 91 266Q664 540 678 540Q681 540 687 534T694 519T687 505Q686 504 417 376L151 250L417 124Q686 -4 687 -5Q694 -11 694 -19Z\"/><path id=\"MJX-TEX-N-31\" d=\"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z\"/><path id=\"MJX-TEX-SO-221A\" d=\"M263 249Q264 249 315 130T417 -108T470 -228L725 302Q981 837 982 839Q989 850 1001 850Q1008 850 1013 844T1020 832V826L741 243Q645 43 540 -176Q479 -303 469 -324T453 -348Q449 -350 436 -350L424 -349L315 -96Q206 156 205 156L171 130Q138 104 137 104L111 130L263 249Z\"/><path id=\"MJX-TEX-I-74\" d=\"M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z\"/><path id=\"MJX-TEX-I-61\" d=\"M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z\"/><path id=\"MJX-TEX-I-72\" d=\"M21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q161 442 183 430T214 408T225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400Q430 381 430 363Q430 333 417 315T391 292T366 288Q346 288 334 299T322 328Q322 376 378 392Q356 405 342 405Q286 405 239 331Q229 315 224 298T190 165Q156 25 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287Z\"/><path id=\"MJX-TEX-I-67\" d=\"M311 43Q296 30 267 15T206 0Q143 0 105 45T66 160Q66 265 143 353T314 442Q361 442 401 394L404 398Q406 401 409 404T418 412T431 419T447 422Q461 422 470 413T480 394Q480 379 423 152T363 -80Q345 -134 286 -169T151 -205Q10 -205 10 -137Q10 -111 28 -91T74 -71Q89 -71 102 -80T116 -111Q116 -121 114 -130T107 -144T99 -154T92 -162L90 -164H91Q101 -167 151 -167Q189 -167 211 -155Q234 -144 254 -122T282 -75Q288 -56 298 -13Q311 35 311 43ZM384 328L380 339Q377 350 375 354T369 368T359 382T346 393T328 402T306 405Q262 405 221 352Q191 313 171 233T151 117Q151 38 213 38Q269 38 323 108L331 118L384 328Z\"/><path id=\"MJX-TEX-I-65\" d=\"M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z\"/></defs></svg>"},{"title":"leetcode-add-two-numbers-ii","date":"2020-04-14T15:22:39.000Z","_content":"\n### 445. 两数相加 II\n\n[题目](https://leetcode-cn.com/problems/add-two-numbers-ii/)\n\n\n\n<!--more-->\n\n\n\n看到顺序的链表就想到用倒序链表的方法做折腾了半天\n\n\n\n```python\nclass ListNode:\n def __init__(self, x):\n self.val = x\n self.next = None\n\nclass Solution:\n def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:\n def _reverse(l):\n if l.next:\n last = _reverse(l.next)\n l.next.next = l\n l.next = None\n return last\n return l\n\n l1e = _reverse(l1)\n l2e = _reverse(l2)\n new_l = ListNode(0)\n head = new_l\n c = 0\n import ipdb; ipdb.set_trace()\n while l1e and l2e:\n new_val = l1e.val + l2e.val\n if c==1:\n new_val += 1\n c = 0\n if new_val >= 10:\n new_val -= 10\n c = 1\n\n new_l.val = new_val\n next_n = None\n if l1e.next and l2e.next or c:\n next_n = ListNode(c)\n new_l.next = next_n\n new_l = next_n\n l1e = l1e.next\n l2e = l2e.next\n if l2e:\n l1e = l2e\n if not l1e and c:\n l1e = ListNode(0)\n while l1e:\n new_l.val = l1e.val\n new_l.val += c\n c = 0\n if new_l.val >= 10:\n c = 1\n new_l.val -= 10\n l1e = l1e.next\n if l1e:\n new_l.next = ListNode(0)\n new_l = new_l.next\n else:\n new_l.next = ListNode(1)\n\n return _reverse(head)\n\n # 84 ms\t13.9 MB\n```\n\n最后面各种进位的处理应该还可以更清晰优雅一些但是懒得搞了感觉很蠢。翻了答案看到了小 tips需要倒序处理的情况可以用栈。\n\n```python\nclass Solution:\n def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:\n s1, s2 = [], []\n while l1:\n s1.append(l1.val)\n l1 = l1.next\n while l2:\n s2.append(l2.val)\n l2 = l2.next\n ans = None\n carry = 0\n while s1 or s2 or carry != 0:\n a = 0 if not s1 else s1.pop()\n b = 0 if not s2 else s2.pop()\n cur = a + b + carry\n carry = cur // 10\n cur %= 10\n curnode = ListNode(cur)\n curnode.next = ans\n ans = curnode\n return ans\n\n作者LeetCode-Solution\n链接https://leetcode-cn.com/problems/add-two-numbers-ii/solution/liang-shu-xiang-jia-ii-by-leetcode-solution/\n来源力扣LeetCode\n著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。\n```\n\n不过就执行效率来看差不多。\n","source":"_posts/2020-04-14-leetcode-add-two-numbers-ii.md","raw":"---\ntitle: leetcode-add-two-numbers-ii\ndate: 2020-04-14 23:22:39\ntags:\ncategories: leetcode\n---\n\n### 445. 两数相加 II\n\n[题目](https://leetcode-cn.com/problems/add-two-numbers-ii/)\n\n\n\n<!--more-->\n\n\n\n看到顺序的链表就想到用倒序链表的方法做折腾了半天\n\n\n\n```python\nclass ListNode:\n def __init__(self, x):\n self.val = x\n self.next = None\n\nclass Solution:\n def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:\n def _reverse(l):\n if l.next:\n last = _reverse(l.next)\n l.next.next = l\n l.next = None\n return last\n return l\n\n l1e = _reverse(l1)\n l2e = _reverse(l2)\n new_l = ListNode(0)\n head = new_l\n c = 0\n import ipdb; ipdb.set_trace()\n while l1e and l2e:\n new_val = l1e.val + l2e.val\n if c==1:\n new_val += 1\n c = 0\n if new_val >= 10:\n new_val -= 10\n c = 1\n\n new_l.val = new_val\n next_n = None\n if l1e.next and l2e.next or c:\n next_n = ListNode(c)\n new_l.next = next_n\n new_l = next_n\n l1e = l1e.next\n l2e = l2e.next\n if l2e:\n l1e = l2e\n if not l1e and c:\n l1e = ListNode(0)\n while l1e:\n new_l.val = l1e.val\n new_l.val += c\n c = 0\n if new_l.val >= 10:\n c = 1\n new_l.val -= 10\n l1e = l1e.next\n if l1e:\n new_l.next = ListNode(0)\n new_l = new_l.next\n else:\n new_l.next = ListNode(1)\n\n return _reverse(head)\n\n # 84 ms\t13.9 MB\n```\n\n最后面各种进位的处理应该还可以更清晰优雅一些但是懒得搞了感觉很蠢。翻了答案看到了小 tips需要倒序处理的情况可以用栈。\n\n```python\nclass Solution:\n def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:\n s1, s2 = [], []\n while l1:\n s1.append(l1.val)\n l1 = l1.next\n while l2:\n s2.append(l2.val)\n l2 = l2.next\n ans = None\n carry = 0\n while s1 or s2 or carry != 0:\n a = 0 if not s1 else s1.pop()\n b = 0 if not s2 else s2.pop()\n cur = a + b + carry\n carry = cur // 10\n cur %= 10\n curnode = ListNode(cur)\n curnode.next = ans\n ans = curnode\n return ans\n\n作者LeetCode-Solution\n链接https://leetcode-cn.com/problems/add-two-numbers-ii/solution/liang-shu-xiang-jia-ii-by-leetcode-solution/\n来源力扣LeetCode\n著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。\n```\n\n不过就执行效率来看差不多。\n","slug":"leetcode-add-two-numbers-ii","published":1,"updated":"2020-04-14T15:28:35.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4u000vsubuzq7vic3v","content":"<h3 id=\"445-__u4E24_u6570_u76F8_u52A0_II\"><a href=\"#445-__u4E24_u6570_u76F8_u52A0_II\" class=\"headerlink\" title=\"445. 两数相加 II\"></a>445. 两数相加 II</h3><p><a href=\"https://leetcode-cn.com/problems/add-two-numbers-ii/\" target=\"_blank\" rel=\"noopener\">题目</a></p>\n<a id=\"more\"></a>\n<p>看到顺序的链表就想到用倒序链表的方法做,折腾了半天</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br><span class=\"line\">42</span><br><span class=\"line\">43</span><br><span class=\"line\">44</span><br><span class=\"line\">45</span><br><span class=\"line\">46</span><br><span class=\"line\">47</span><br><span class=\"line\">48</span><br><span class=\"line\">49</span><br><span class=\"line\">50</span><br><span class=\"line\">51</span><br><span class=\"line\">52</span><br><span class=\"line\">53</span><br><span class=\"line\">54</span><br><span class=\"line\">55</span><br><span class=\"line\">56</span><br><span class=\"line\">57</span><br><span class=\"line\">58</span><br><span class=\"line\">59</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">ListNode</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">__init__</span><span class=\"params\">(self, x)</span>:</span></span><br><span class=\"line\"> self.val = x</span><br><span class=\"line\"> self.next = <span class=\"keyword\">None</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">addTwoNumbers</span><span class=\"params\">(self, l1: ListNode, l2: ListNode)</span> -&gt; ListNode:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">_reverse</span><span class=\"params\">(l)</span>:</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> l.next:</span><br><span class=\"line\"> last = _reverse(l.next)</span><br><span class=\"line\"> l.next.next = l</span><br><span class=\"line\"> l.next = <span class=\"keyword\">None</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> last</span><br><span class=\"line\"> <span class=\"keyword\">return</span> l</span><br><span class=\"line\"></span><br><span class=\"line\"> l1e = _reverse(l1)</span><br><span class=\"line\"> l2e = _reverse(l2)</span><br><span class=\"line\"> new_l = ListNode(<span class=\"number\">0</span>)</span><br><span class=\"line\"> head = new_l</span><br><span class=\"line\"> c = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">import</span> ipdb; ipdb.set_trace()</span><br><span class=\"line\"> <span class=\"keyword\">while</span> l1e <span class=\"keyword\">and</span> l2e:</span><br><span class=\"line\"> new_val = l1e.val + l2e.val</span><br><span class=\"line\"> <span class=\"keyword\">if</span> c==<span class=\"number\">1</span>:</span><br><span class=\"line\"> new_val += <span class=\"number\">1</span></span><br><span class=\"line\"> c = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> new_val &gt;= <span class=\"number\">10</span>:</span><br><span class=\"line\"> new_val -= <span class=\"number\">10</span></span><br><span class=\"line\"> c = <span class=\"number\">1</span></span><br><span class=\"line\"></span><br><span class=\"line\"> new_l.val = new_val</span><br><span class=\"line\"> next_n = <span class=\"keyword\">None</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> l1e.next <span class=\"keyword\">and</span> l2e.next <span class=\"keyword\">or</span> c:</span><br><span class=\"line\"> next_n = ListNode(c)</span><br><span class=\"line\"> new_l.next = next_n</span><br><span class=\"line\"> new_l = next_n</span><br><span class=\"line\"> l1e = l1e.next</span><br><span class=\"line\"> l2e = l2e.next</span><br><span class=\"line\"> <span class=\"keyword\">if</span> l2e:</span><br><span class=\"line\"> l1e = l2e</span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> l1e <span class=\"keyword\">and</span> c:</span><br><span class=\"line\"> l1e = ListNode(<span class=\"number\">0</span>)</span><br><span class=\"line\"> <span class=\"keyword\">while</span> l1e:</span><br><span class=\"line\"> new_l.val = l1e.val</span><br><span class=\"line\"> new_l.val += c</span><br><span class=\"line\"> c = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> new_l.val &gt;= <span class=\"number\">10</span>:</span><br><span class=\"line\"> c = <span class=\"number\">1</span></span><br><span class=\"line\"> new_l.val -= <span class=\"number\">10</span></span><br><span class=\"line\"> l1e = l1e.next</span><br><span class=\"line\"> <span class=\"keyword\">if</span> l1e:</span><br><span class=\"line\"> new_l.next = ListNode(<span class=\"number\">0</span>)</span><br><span class=\"line\"> new_l = new_l.next</span><br><span class=\"line\"> <span class=\"keyword\">else</span>:</span><br><span class=\"line\"> new_l.next = ListNode(<span class=\"number\">1</span>)</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"keyword\">return</span> _reverse(head)</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"comment\"># 84 ms\t13.9 MB</span></span><br></pre></td></tr></table></figure>\n<p>最后面各种进位的处理应该还可以更清晰优雅一些,但是懒得搞了,感觉很蠢。翻了答案看到了小 tips需要倒序处理的情况可以用栈。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">addTwoNumbers</span><span class=\"params\">(self, l1: ListNode, l2: ListNode)</span> -&gt; ListNode:</span></span><br><span class=\"line\"> s1, s2 = [], []</span><br><span class=\"line\"> <span class=\"keyword\">while</span> l1:</span><br><span class=\"line\"> s1.append(l1.val)</span><br><span class=\"line\"> l1 = l1.next</span><br><span class=\"line\"> <span class=\"keyword\">while</span> l2:</span><br><span class=\"line\"> s2.append(l2.val)</span><br><span class=\"line\"> l2 = l2.next</span><br><span class=\"line\"> ans = <span class=\"keyword\">None</span></span><br><span class=\"line\"> carry = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">while</span> s1 <span class=\"keyword\">or</span> s2 <span class=\"keyword\">or</span> carry != <span class=\"number\">0</span>:</span><br><span class=\"line\"> a = <span class=\"number\">0</span> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> s1 <span class=\"keyword\">else</span> s1.pop()</span><br><span class=\"line\"> b = <span class=\"number\">0</span> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> s2 <span class=\"keyword\">else</span> s2.pop()</span><br><span class=\"line\"> cur = a + b + carry</span><br><span class=\"line\"> carry = cur // <span class=\"number\">10</span></span><br><span class=\"line\"> cur %= <span class=\"number\">10</span></span><br><span class=\"line\"> curnode = ListNode(cur)</span><br><span class=\"line\"> curnode.next = ans</span><br><span class=\"line\"> ans = curnode</span><br><span class=\"line\"> <span class=\"keyword\">return</span> ans</span><br><span class=\"line\"></span><br><span class=\"line\">作者LeetCode-Solution</span><br><span class=\"line\">链接https://leetcode-cn.com/problems/add-two-numbers-ii/solution/liang-shu-xiang-jia-ii-by-leetcode-solution/</span><br><span class=\"line\">来源力扣LeetCode</span><br><span class=\"line\">著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</span><br></pre></td></tr></table></figure>\n<p>不过就执行效率来看差不多。</p>\n","site":{"data":{}},"excerpt":"<h3 id=\"445-__u4E24_u6570_u76F8_u52A0_II\"><a href=\"#445-__u4E24_u6570_u76F8_u52A0_II\" class=\"headerlink\" title=\"445. 两数相加 II\"></a>445. 两数相加 II</h3><p><a href=\"https://leetcode-cn.com/problems/add-two-numbers-ii/\" target=\"_blank\" rel=\"noopener\">题目</a></p>","more":"<p>看到顺序的链表就想到用倒序链表的方法做,折腾了半天</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br><span class=\"line\">42</span><br><span class=\"line\">43</span><br><span class=\"line\">44</span><br><span class=\"line\">45</span><br><span class=\"line\">46</span><br><span class=\"line\">47</span><br><span class=\"line\">48</span><br><span class=\"line\">49</span><br><span class=\"line\">50</span><br><span class=\"line\">51</span><br><span class=\"line\">52</span><br><span class=\"line\">53</span><br><span class=\"line\">54</span><br><span class=\"line\">55</span><br><span class=\"line\">56</span><br><span class=\"line\">57</span><br><span class=\"line\">58</span><br><span class=\"line\">59</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">ListNode</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">__init__</span><span class=\"params\">(self, x)</span>:</span></span><br><span class=\"line\"> self.val = x</span><br><span class=\"line\"> self.next = <span class=\"keyword\">None</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">addTwoNumbers</span><span class=\"params\">(self, l1: ListNode, l2: ListNode)</span> -&gt; ListNode:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">_reverse</span><span class=\"params\">(l)</span>:</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> l.next:</span><br><span class=\"line\"> last = _reverse(l.next)</span><br><span class=\"line\"> l.next.next = l</span><br><span class=\"line\"> l.next = <span class=\"keyword\">None</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> last</span><br><span class=\"line\"> <span class=\"keyword\">return</span> l</span><br><span class=\"line\"></span><br><span class=\"line\"> l1e = _reverse(l1)</span><br><span class=\"line\"> l2e = _reverse(l2)</span><br><span class=\"line\"> new_l = ListNode(<span class=\"number\">0</span>)</span><br><span class=\"line\"> head = new_l</span><br><span class=\"line\"> c = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">import</span> ipdb; ipdb.set_trace()</span><br><span class=\"line\"> <span class=\"keyword\">while</span> l1e <span class=\"keyword\">and</span> l2e:</span><br><span class=\"line\"> new_val = l1e.val + l2e.val</span><br><span class=\"line\"> <span class=\"keyword\">if</span> c==<span class=\"number\">1</span>:</span><br><span class=\"line\"> new_val += <span class=\"number\">1</span></span><br><span class=\"line\"> c = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> new_val &gt;= <span class=\"number\">10</span>:</span><br><span class=\"line\"> new_val -= <span class=\"number\">10</span></span><br><span class=\"line\"> c = <span class=\"number\">1</span></span><br><span class=\"line\"></span><br><span class=\"line\"> new_l.val = new_val</span><br><span class=\"line\"> next_n = <span class=\"keyword\">None</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> l1e.next <span class=\"keyword\">and</span> l2e.next <span class=\"keyword\">or</span> c:</span><br><span class=\"line\"> next_n = ListNode(c)</span><br><span class=\"line\"> new_l.next = next_n</span><br><span class=\"line\"> new_l = next_n</span><br><span class=\"line\"> l1e = l1e.next</span><br><span class=\"line\"> l2e = l2e.next</span><br><span class=\"line\"> <span class=\"keyword\">if</span> l2e:</span><br><span class=\"line\"> l1e = l2e</span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> l1e <span class=\"keyword\">and</span> c:</span><br><span class=\"line\"> l1e = ListNode(<span class=\"number\">0</span>)</span><br><span class=\"line\"> <span class=\"keyword\">while</span> l1e:</span><br><span class=\"line\"> new_l.val = l1e.val</span><br><span class=\"line\"> new_l.val += c</span><br><span class=\"line\"> c = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> new_l.val &gt;= <span class=\"number\">10</span>:</span><br><span class=\"line\"> c = <span class=\"number\">1</span></span><br><span class=\"line\"> new_l.val -= <span class=\"number\">10</span></span><br><span class=\"line\"> l1e = l1e.next</span><br><span class=\"line\"> <span class=\"keyword\">if</span> l1e:</span><br><span class=\"line\"> new_l.next = ListNode(<span class=\"number\">0</span>)</span><br><span class=\"line\"> new_l = new_l.next</span><br><span class=\"line\"> <span class=\"keyword\">else</span>:</span><br><span class=\"line\"> new_l.next = ListNode(<span class=\"number\">1</span>)</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"keyword\">return</span> _reverse(head)</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"comment\"># 84 ms\t13.9 MB</span></span><br></pre></td></tr></table></figure>\n<p>最后面各种进位的处理应该还可以更清晰优雅一些,但是懒得搞了,感觉很蠢。翻了答案看到了小 tips需要倒序处理的情况可以用栈。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">addTwoNumbers</span><span class=\"params\">(self, l1: ListNode, l2: ListNode)</span> -&gt; ListNode:</span></span><br><span class=\"line\"> s1, s2 = [], []</span><br><span class=\"line\"> <span class=\"keyword\">while</span> l1:</span><br><span class=\"line\"> s1.append(l1.val)</span><br><span class=\"line\"> l1 = l1.next</span><br><span class=\"line\"> <span class=\"keyword\">while</span> l2:</span><br><span class=\"line\"> s2.append(l2.val)</span><br><span class=\"line\"> l2 = l2.next</span><br><span class=\"line\"> ans = <span class=\"keyword\">None</span></span><br><span class=\"line\"> carry = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">while</span> s1 <span class=\"keyword\">or</span> s2 <span class=\"keyword\">or</span> carry != <span class=\"number\">0</span>:</span><br><span class=\"line\"> a = <span class=\"number\">0</span> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> s1 <span class=\"keyword\">else</span> s1.pop()</span><br><span class=\"line\"> b = <span class=\"number\">0</span> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> s2 <span class=\"keyword\">else</span> s2.pop()</span><br><span class=\"line\"> cur = a + b + carry</span><br><span class=\"line\"> carry = cur // <span class=\"number\">10</span></span><br><span class=\"line\"> cur %= <span class=\"number\">10</span></span><br><span class=\"line\"> curnode = ListNode(cur)</span><br><span class=\"line\"> curnode.next = ans</span><br><span class=\"line\"> ans = curnode</span><br><span class=\"line\"> <span class=\"keyword\">return</span> ans</span><br><span class=\"line\"></span><br><span class=\"line\">作者LeetCode-Solution</span><br><span class=\"line\">链接https://leetcode-cn.com/problems/add-two-numbers-ii/solution/liang-shu-xiang-jia-ii-by-leetcode-solution/</span><br><span class=\"line\">来源力扣LeetCode</span><br><span class=\"line\">著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</span><br></pre></td></tr></table></figure>\n<p>不过就执行效率来看差不多。</p>"},{"title":"leetcode-the-masseuse-lcci","date":"2020-04-08T16:35:26.000Z","mathjax":true,"_content":"\n### 面试题 17.16. 按摩师\n\n[题目](https://leetcode-cn.com/problems/the-masseuse-lcci/)\n\n\n\n<!--more-->\n\n\n\n一开始以为是用递归想了半天没想出来偷看了一下答案。答案的思路跟递归类似假设在当前 $i$ 时刻,$dp[i][0]$ 为当前预约不接的情况下最长预约时间,$dp[i][1]$ 则为接受当前预约的最长预约时间。\n\n\n\n那很显然由于不能接受相邻两个预约$dp[i][1] = dp[i-1][0] + nums_i$\n\n不接受当前预约的话上一个预约接不接受都可以$dp[i][0] = max(dp[i-1][0], dp[i-1][1])$\n\n最后只要比较两种情况即可 $max(dp[i][0], dp[i][1])$\n\n\n\n```python\nclass Solution:\n def massage(self, nums) -> int:\n if not nums:\n return 0\n n = len(nums)\n not_choose = 0\n choose = 0\n for n in nums:\n not_choose, choose = max(not_choose, choose), not_choose+n\n return max(not_choose, choose)\n # 52 ms\t13.6 MB\n```\n\n\n\n这种问题原来有个名字叫[动态规划](https://zh.wikipedia.org/wiki/动态规划),上面推导的方程叫[状态转移方程](https://baike.baidu.com/item/状态转移方程),可以找找资料来看一下。\n","source":"_posts/2020-04-09-leetcode-the-masseuse-lcci.md","raw":"---\ntitle: leetcode-the-masseuse-lcci\ndate: 2020-04-09 00:35:26\ntags:\ncategories: leetcode\nmathjax: true\n---\n\n### 面试题 17.16. 按摩师\n\n[题目](https://leetcode-cn.com/problems/the-masseuse-lcci/)\n\n\n\n<!--more-->\n\n\n\n一开始以为是用递归想了半天没想出来偷看了一下答案。答案的思路跟递归类似假设在当前 $i$ 时刻,$dp[i][0]$ 为当前预约不接的情况下最长预约时间,$dp[i][1]$ 则为接受当前预约的最长预约时间。\n\n\n\n那很显然由于不能接受相邻两个预约$dp[i][1] = dp[i-1][0] + nums_i$\n\n不接受当前预约的话上一个预约接不接受都可以$dp[i][0] = max(dp[i-1][0], dp[i-1][1])$\n\n最后只要比较两种情况即可 $max(dp[i][0], dp[i][1])$\n\n\n\n```python\nclass Solution:\n def massage(self, nums) -> int:\n if not nums:\n return 0\n n = len(nums)\n not_choose = 0\n choose = 0\n for n in nums:\n not_choose, choose = max(not_choose, choose), not_choose+n\n return max(not_choose, choose)\n # 52 ms\t13.6 MB\n```\n\n\n\n这种问题原来有个名字叫[动态规划](https://zh.wikipedia.org/wiki/动态规划),上面推导的方程叫[状态转移方程](https://baike.baidu.com/item/状态转移方程),可以找找资料来看一下。\n","slug":"leetcode-the-masseuse-lcci","published":1,"updated":"2020-04-08T17:14:04.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4v000xsubu9bmmz6rr","content":"<h3 id=\"u9762_u8BD5_u9898_17-16-__u6309_u6469_u5E08\"><a href=\"#u9762_u8BD5_u9898_17-16-__u6309_u6469_u5E08\" class=\"headerlink\" title=\"面试题 17.16. 按摩师\"></a>面试题 17.16. 按摩师</h3><p><a href=\"https://leetcode-cn.com/problems/the-masseuse-lcci/\" target=\"_blank\" rel=\"noopener\">题目</a></p>\n<a id=\"more\"></a>\n<p>一开始以为是用递归,想了半天没想出来,偷看了一下答案。答案的思路跟递归类似,假设在当前 <mjx-container class=\"MathJax\" jax=\"SVG\"><svg style=\"vertical-align: -0.025ex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"0.781ex\" height=\"1.52ex\" role=\"img\" focusable=\"false\" viewbox=\"0 -661 345 672\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"matrix(1 0 0 -1 0 0)\"><g data-mml-node=\"math\"><g data-mml-node=\"mi\"><use xlink:href=\"#MJX-TEX-I-69\"/></g></g></g></svg></mjx-container> 时刻,<mjx-container class=\"MathJax\" jax=\"SVG\"><svg style=\"vertical-align: -0.566ex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"6.742ex\" height=\"2.262ex\" role=\"img\" focusable=\"false\" viewbox=\"0 -750 2980 1000\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"matrix(1 0 0 -1 0 0)\"><g data-mml-node=\"math\"><g data-mml-node=\"mi\"><use xlink:href=\"#MJX-TEX-I-64\"/></g><g data-mml-node=\"mi\" transform=\"translate(520, 0)\"><use xlink:href=\"#MJX-TEX-I-70\"/></g><g data-mml-node=\"mo\" transform=\"translate(1023, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mi\" transform=\"translate(1301, 0)\"><use xlink:href=\"#MJX-TEX-I-69\"/></g><g data-mml-node=\"mo\" transform=\"translate(1646, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(1924, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mn\" transform=\"translate(2202, 0)\"><use xlink:href=\"#MJX-TEX-N-30\"/></g><g data-mml-node=\"mo\" transform=\"translate(2702, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g></g></g></svg></mjx-container> 为当前预约不接的情况下最长预约时间,<mjx-container class=\"MathJax\" jax=\"SVG\"><svg style=\"vertical-align: -0.566ex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"6.742ex\" height=\"2.262ex\" role=\"img\" focusable=\"false\" viewbox=\"0 -750 2980 1000\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"matrix(1 0 0 -1 0 0)\"><g data-mml-node=\"math\"><g data-mml-node=\"mi\"><use xlink:href=\"#MJX-TEX-I-64\"/></g><g data-mml-node=\"mi\" transform=\"translate(520, 0)\"><use xlink:href=\"#MJX-TEX-I-70\"/></g><g data-mml-node=\"mo\" transform=\"translate(1023, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mi\" transform=\"translate(1301, 0)\"><use xlink:href=\"#MJX-TEX-I-69\"/></g><g data-mml-node=\"mo\" transform=\"translate(1646, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(1924, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mn\" transform=\"translate(2202, 0)\"><use xlink:href=\"#MJX-TEX-N-31\"/></g><g data-mml-node=\"mo\" transform=\"translate(2702, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g></g></g></svg></mjx-container> 则为接受当前预约的最长预约时间。</p>\n<p>那很显然,由于不能接受相邻两个预约,<mjx-container class=\"MathJax\" jax=\"SVG\"><svg style=\"vertical-align: -0.566ex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"29.528ex\" height=\"2.262ex\" role=\"img\" focusable=\"false\" viewbox=\"0 -750 13051.4 1000\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"matrix(1 0 0 -1 0 0)\"><g data-mml-node=\"math\"><g data-mml-node=\"mi\"><use xlink:href=\"#MJX-TEX-I-64\"/></g><g data-mml-node=\"mi\" transform=\"translate(520, 0)\"><use xlink:href=\"#MJX-TEX-I-70\"/></g><g data-mml-node=\"mo\" transform=\"translate(1023, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mi\" transform=\"translate(1301, 0)\"><use xlink:href=\"#MJX-TEX-I-69\"/></g><g data-mml-node=\"mo\" transform=\"translate(1646, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(1924, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mn\" transform=\"translate(2202, 0)\"><use xlink:href=\"#MJX-TEX-N-31\"/></g><g data-mml-node=\"mo\" transform=\"translate(2702, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(3257.8, 0)\"><use xlink:href=\"#MJX-TEX-N-3D\"/></g><g data-mml-node=\"mi\" transform=\"translate(4313.6, 0)\"><use xlink:href=\"#MJX-TEX-I-64\"/></g><g data-mml-node=\"mi\" transform=\"translate(4833.6, 0)\"><use xlink:href=\"#MJX-TEX-I-70\"/></g><g data-mml-node=\"mo\" transform=\"translate(5336.6, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mi\" transform=\"translate(5614.6, 0)\"><use xlink:href=\"#MJX-TEX-I-69\"/></g><g data-mml-node=\"mo\" transform=\"translate(6181.8, 0)\"><use xlink:href=\"#MJX-TEX-N-2212\"/></g><g data-mml-node=\"mn\" transform=\"translate(7182, 0)\"><use xlink:href=\"#MJX-TEX-N-31\"/></g><g data-mml-node=\"mo\" transform=\"translate(7682, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(7960, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mn\" transform=\"translate(8238, 0)\"><use xlink:href=\"#MJX-TEX-N-30\"/></g><g data-mml-node=\"mo\" transform=\"translate(8738, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(9238.2, 0)\"><use xlink:href=\"#MJX-TEX-N-2B\"/></g><g data-mml-node=\"mi\" transform=\"translate(10238.4, 0)\"><use xlink:href=\"#MJX-TEX-I-6E\"/></g><g data-mml-node=\"mi\" transform=\"translate(10838.4, 0)\"><use xlink:href=\"#MJX-TEX-I-75\"/></g><g data-mml-node=\"mi\" transform=\"translate(11410.4, 0)\"><use xlink:href=\"#MJX-TEX-I-6D\"/></g><g data-mml-node=\"msub\" transform=\"translate(12288.4, 0)\"><g data-mml-node=\"mi\"><use xlink:href=\"#MJX-TEX-I-73\"/></g><g data-mml-node=\"mi\" transform=\"translate(469, -150) scale(0.707)\"><use xlink:href=\"#MJX-TEX-I-69\"/></g></g></g></g></svg></mjx-container></p>\n<p>不接受当前预约的话,上一个预约接不接受都可以,<mjx-container class=\"MathJax\" jax=\"SVG\"><svg style=\"vertical-align: -0.566ex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"38.281ex\" height=\"2.262ex\" role=\"img\" focusable=\"false\" viewbox=\"0 -750 16920.1 1000\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"matrix(1 0 0 -1 0 0)\"><g data-mml-node=\"math\"><g data-mml-node=\"mi\"><use xlink:href=\"#MJX-TEX-I-64\"/></g><g data-mml-node=\"mi\" transform=\"translate(520, 0)\"><use xlink:href=\"#MJX-TEX-I-70\"/></g><g data-mml-node=\"mo\" transform=\"translate(1023, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mi\" transform=\"translate(1301, 0)\"><use xlink:href=\"#MJX-TEX-I-69\"/></g><g data-mml-node=\"mo\" transform=\"translate(1646, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(1924, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mn\" transform=\"translate(2202, 0)\"><use xlink:href=\"#MJX-TEX-N-30\"/></g><g data-mml-node=\"mo\" transform=\"translate(2702, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(3257.8, 0)\"><use xlink:href=\"#MJX-TEX-N-3D\"/></g><g data-mml-node=\"mi\" transform=\"translate(4313.6, 0)\"><use xlink:href=\"#MJX-TEX-I-6D\"/></g><g data-mml-node=\"mi\" transform=\"translate(5191.6, 0)\"><use xlink:href=\"#MJX-TEX-I-61\"/></g><g data-mml-node=\"mi\" transform=\"translate(5720.6, 0)\"><use xlink:href=\"#MJX-TEX-I-78\"/></g><g data-mml-node=\"mo\" transform=\"translate(6292.6, 0)\"><use xlink:href=\"#MJX-TEX-N-28\"/></g><g data-mml-node=\"mi\" transform=\"translate(6681.6, 0)\"><use xlink:href=\"#MJX-TEX-I-64\"/></g><g data-mml-node=\"mi\" transform=\"translate(7201.6, 0)\"><use xlink:href=\"#MJX-TEX-I-70\"/></g><g data-mml-node=\"mo\" transform=\"translate(7704.6, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mi\" transform=\"translate(7982.6, 0)\"><use xlink:href=\"#MJX-TEX-I-69\"/></g><g data-mml-node=\"mo\" transform=\"translate(8549.8, 0)\"><use xlink:href=\"#MJX-TEX-N-2212\"/></g><g data-mml-node=\"mn\" transform=\"translate(9550, 0)\"><use xlink:href=\"#MJX-TEX-N-31\"/></g><g data-mml-node=\"mo\" transform=\"translate(10050, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(10328, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mn\" transform=\"translate(10606, 0)\"><use xlink:href=\"#MJX-TEX-N-30\"/></g><g data-mml-node=\"mo\" transform=\"translate(11106, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(11384, 0)\"><use xlink:href=\"#MJX-TEX-N-2C\"/></g><g data-mml-node=\"mi\" transform=\"translate(11828.7, 0)\"><use xlink:href=\"#MJX-TEX-I-64\"/></g><g data-mml-node=\"mi\" transform=\"translate(12348.7, 0)\"><use xlink:href=\"#MJX-TEX-I-70\"/></g><g data-mml-node=\"mo\" transform=\"translate(12851.7, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mi\" transform=\"translate(13129.7, 0)\"><use xlink:href=\"#MJX-TEX-I-69\"/></g><g data-mml-node=\"mo\" transform=\"translate(13696.9, 0)\"><use xlink:href=\"#MJX-TEX-N-2212\"/></g><g data-mml-node=\"mn\" transform=\"translate(14697.1, 0)\"><use xlink:href=\"#MJX-TEX-N-31\"/></g><g data-mml-node=\"mo\" transform=\"translate(15197.1, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(15475.1, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mn\" transform=\"translate(15753.1, 0)\"><use xlink:href=\"#MJX-TEX-N-31\"/></g><g data-mml-node=\"mo\" transform=\"translate(16253.1, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(16531.1, 0)\"><use xlink:href=\"#MJX-TEX-N-29\"/></g></g></g></svg></mjx-container></p>\n<p>最后只要比较两种情况即可 <mjx-container class=\"MathJax\" jax=\"SVG\"><svg style=\"vertical-align: -0.566ex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20.728ex\" height=\"2.262ex\" role=\"img\" focusable=\"false\" viewbox=\"0 -750 9161.7 1000\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"matrix(1 0 0 -1 0 0)\"><g data-mml-node=\"math\"><g data-mml-node=\"mi\"><use xlink:href=\"#MJX-TEX-I-6D\"/></g><g data-mml-node=\"mi\" transform=\"translate(878, 0)\"><use xlink:href=\"#MJX-TEX-I-61\"/></g><g data-mml-node=\"mi\" transform=\"translate(1407, 0)\"><use xlink:href=\"#MJX-TEX-I-78\"/></g><g data-mml-node=\"mo\" transform=\"translate(1979, 0)\"><use xlink:href=\"#MJX-TEX-N-28\"/></g><g data-mml-node=\"mi\" transform=\"translate(2368, 0)\"><use xlink:href=\"#MJX-TEX-I-64\"/></g><g data-mml-node=\"mi\" transform=\"translate(2888, 0)\"><use xlink:href=\"#MJX-TEX-I-70\"/></g><g data-mml-node=\"mo\" transform=\"translate(3391, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mi\" transform=\"translate(3669, 0)\"><use xlink:href=\"#MJX-TEX-I-69\"/></g><g data-mml-node=\"mo\" transform=\"translate(4014, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(4292, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mn\" transform=\"translate(4570, 0)\"><use xlink:href=\"#MJX-TEX-N-30\"/></g><g data-mml-node=\"mo\" transform=\"translate(5070, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(5348, 0)\"><use xlink:href=\"#MJX-TEX-N-2C\"/></g><g data-mml-node=\"mi\" transform=\"translate(5792.7, 0)\"><use xlink:href=\"#MJX-TEX-I-64\"/></g><g data-mml-node=\"mi\" transform=\"translate(6312.7, 0)\"><use xlink:href=\"#MJX-TEX-I-70\"/></g><g data-mml-node=\"mo\" transform=\"translate(6815.7, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mi\" transform=\"translate(7093.7, 0)\"><use xlink:href=\"#MJX-TEX-I-69\"/></g><g data-mml-node=\"mo\" transform=\"translate(7438.7, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(7716.7, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mn\" transform=\"translate(7994.7, 0)\"><use xlink:href=\"#MJX-TEX-N-31\"/></g><g data-mml-node=\"mo\" transform=\"translate(8494.7, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(8772.7, 0)\"><use xlink:href=\"#MJX-TEX-N-29\"/></g></g></g></svg></mjx-container></p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">massage</span><span class=\"params\">(self, nums)</span> -&gt; int:</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> nums:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"number\">0</span></span><br><span class=\"line\"> n = len(nums)</span><br><span class=\"line\"> not_choose = <span class=\"number\">0</span></span><br><span class=\"line\"> choose = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> n <span class=\"keyword\">in</span> nums:</span><br><span class=\"line\"> not_choose, choose = max(not_choose, choose), not_choose+n</span><br><span class=\"line\"> <span class=\"keyword\">return</span> max(not_choose, choose)</span><br><span class=\"line\"> <span class=\"comment\"># 52 ms\t13.6 MB</span></span><br></pre></td></tr></table></figure>\n<p>这种问题原来有个名字叫<a href=\"https://zh.wikipedia.org/wiki/动态规划\" target=\"_blank\" rel=\"noopener\">动态规划</a>,上面推导的方程叫<a href=\"https://baike.baidu.com/item/状态转移方程\" target=\"_blank\" rel=\"noopener\">状态转移方程</a>,可以找找资料来看一下。</p>\n<svg style=\"display: none\" id=\"MJX-SVG-global-cache\"><defs><path id=\"MJX-TEX-I-69\" d=\"M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z\"/><path id=\"MJX-TEX-I-64\" d=\"M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z\"/><path id=\"MJX-TEX-I-70\" d=\"M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z\"/><path id=\"MJX-TEX-N-5B\" d=\"M118 -250V750H255V710H158V-210H255V-250H118Z\"/><path id=\"MJX-TEX-N-5D\" d=\"M22 710V750H159V-250H22V-210H119V710H22Z\"/><path id=\"MJX-TEX-N-30\" d=\"M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z\"/><path id=\"MJX-TEX-N-31\" d=\"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z\"/><path id=\"MJX-TEX-N-3D\" d=\"M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z\"/><path id=\"MJX-TEX-N-2212\" d=\"M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z\"/><path id=\"MJX-TEX-N-2B\" d=\"M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z\"/><path id=\"MJX-TEX-I-6E\" d=\"M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z\"/><path id=\"MJX-TEX-I-75\" d=\"M21 287Q21 295 30 318T55 370T99 420T158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27T291 44T328 78L339 95Q341 99 377 247Q407 367 413 387T427 416Q444 431 463 431Q480 431 488 421T496 402L420 84Q419 79 419 68Q419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153Q551 153 551 144Q550 139 549 130T540 98T523 55T498 17T462 -8Q454 -10 438 -10Q372 -10 347 46Q345 45 336 36T318 21T296 6T267 -6T233 -11Q189 -11 155 7Q103 38 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z\"/><path id=\"MJX-TEX-I-6D\" d=\"M21 287Q22 293 24 303T36 341T56 388T88 425T132 442T175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q303 442 384 442Q401 442 415 440T441 433T460 423T475 411T485 398T493 385T497 373T500 364T502 357L510 367Q573 442 659 442Q713 442 746 415T780 336Q780 285 742 178T704 50Q705 36 709 31T724 26Q752 26 776 56T815 138Q818 149 821 151T837 153Q857 153 857 145Q857 144 853 130Q845 101 831 73T785 17T716 -10Q669 -10 648 17T627 73Q627 92 663 193T700 345Q700 404 656 404H651Q565 404 506 303L499 291L466 157Q433 26 428 16Q415 -11 385 -11Q372 -11 364 -4T353 8T350 18Q350 29 384 161L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 181Q151 335 151 342Q154 357 154 369Q154 405 129 405Q107 405 92 377T69 316T57 280Q55 278 41 278H27Q21 284 21 287Z\"/><path id=\"MJX-TEX-I-73\" d=\"M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z\"/><path id=\"MJX-TEX-I-61\" d=\"M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z\"/><path id=\"MJX-TEX-I-78\" d=\"M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z\"/><path id=\"MJX-TEX-N-28\" d=\"M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z\"/><path id=\"MJX-TEX-N-2C\" d=\"M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z\"/><path id=\"MJX-TEX-N-29\" d=\"M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z\"/></defs></svg>","site":{"data":{}},"excerpt":"<h3 id=\"u9762_u8BD5_u9898_17-16-__u6309_u6469_u5E08\"><a href=\"#u9762_u8BD5_u9898_17-16-__u6309_u6469_u5E08\" class=\"headerlink\" title=\"面试题 17.16. 按摩师\"></a>面试题 17.16. 按摩师</h3><p><a href=\"https://leetcode-cn.com/problems/the-masseuse-lcci/\" target=\"_blank\" rel=\"noopener\">题目</a></p>","more":"<p>一开始以为是用递归,想了半天没想出来,偷看了一下答案。答案的思路跟递归类似,假设在当前 <mjx-container class=\"MathJax\" jax=\"SVG\"><svg style=\"vertical-align: -0.025ex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"0.781ex\" height=\"1.52ex\" role=\"img\" focusable=\"false\" viewbox=\"0 -661 345 672\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"matrix(1 0 0 -1 0 0)\"><g data-mml-node=\"math\"><g data-mml-node=\"mi\"><use xlink:href=\"#MJX-TEX-I-69\"/></g></g></g></svg></mjx-container> 时刻,<mjx-container class=\"MathJax\" jax=\"SVG\"><svg style=\"vertical-align: -0.566ex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"6.742ex\" height=\"2.262ex\" role=\"img\" focusable=\"false\" viewbox=\"0 -750 2980 1000\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"matrix(1 0 0 -1 0 0)\"><g data-mml-node=\"math\"><g data-mml-node=\"mi\"><use xlink:href=\"#MJX-TEX-I-64\"/></g><g data-mml-node=\"mi\" transform=\"translate(520, 0)\"><use xlink:href=\"#MJX-TEX-I-70\"/></g><g data-mml-node=\"mo\" transform=\"translate(1023, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mi\" transform=\"translate(1301, 0)\"><use xlink:href=\"#MJX-TEX-I-69\"/></g><g data-mml-node=\"mo\" transform=\"translate(1646, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(1924, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mn\" transform=\"translate(2202, 0)\"><use xlink:href=\"#MJX-TEX-N-30\"/></g><g data-mml-node=\"mo\" transform=\"translate(2702, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g></g></g></svg></mjx-container> 为当前预约不接的情况下最长预约时间,<mjx-container class=\"MathJax\" jax=\"SVG\"><svg style=\"vertical-align: -0.566ex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"6.742ex\" height=\"2.262ex\" role=\"img\" focusable=\"false\" viewbox=\"0 -750 2980 1000\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"matrix(1 0 0 -1 0 0)\"><g data-mml-node=\"math\"><g data-mml-node=\"mi\"><use xlink:href=\"#MJX-TEX-I-64\"/></g><g data-mml-node=\"mi\" transform=\"translate(520, 0)\"><use xlink:href=\"#MJX-TEX-I-70\"/></g><g data-mml-node=\"mo\" transform=\"translate(1023, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mi\" transform=\"translate(1301, 0)\"><use xlink:href=\"#MJX-TEX-I-69\"/></g><g data-mml-node=\"mo\" transform=\"translate(1646, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(1924, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mn\" transform=\"translate(2202, 0)\"><use xlink:href=\"#MJX-TEX-N-31\"/></g><g data-mml-node=\"mo\" transform=\"translate(2702, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g></g></g></svg></mjx-container> 则为接受当前预约的最长预约时间。</p>\n<p>那很显然,由于不能接受相邻两个预约,<mjx-container class=\"MathJax\" jax=\"SVG\"><svg style=\"vertical-align: -0.566ex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"29.528ex\" height=\"2.262ex\" role=\"img\" focusable=\"false\" viewbox=\"0 -750 13051.4 1000\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"matrix(1 0 0 -1 0 0)\"><g data-mml-node=\"math\"><g data-mml-node=\"mi\"><use xlink:href=\"#MJX-TEX-I-64\"/></g><g data-mml-node=\"mi\" transform=\"translate(520, 0)\"><use xlink:href=\"#MJX-TEX-I-70\"/></g><g data-mml-node=\"mo\" transform=\"translate(1023, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mi\" transform=\"translate(1301, 0)\"><use xlink:href=\"#MJX-TEX-I-69\"/></g><g data-mml-node=\"mo\" transform=\"translate(1646, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(1924, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mn\" transform=\"translate(2202, 0)\"><use xlink:href=\"#MJX-TEX-N-31\"/></g><g data-mml-node=\"mo\" transform=\"translate(2702, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(3257.8, 0)\"><use xlink:href=\"#MJX-TEX-N-3D\"/></g><g data-mml-node=\"mi\" transform=\"translate(4313.6, 0)\"><use xlink:href=\"#MJX-TEX-I-64\"/></g><g data-mml-node=\"mi\" transform=\"translate(4833.6, 0)\"><use xlink:href=\"#MJX-TEX-I-70\"/></g><g data-mml-node=\"mo\" transform=\"translate(5336.6, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mi\" transform=\"translate(5614.6, 0)\"><use xlink:href=\"#MJX-TEX-I-69\"/></g><g data-mml-node=\"mo\" transform=\"translate(6181.8, 0)\"><use xlink:href=\"#MJX-TEX-N-2212\"/></g><g data-mml-node=\"mn\" transform=\"translate(7182, 0)\"><use xlink:href=\"#MJX-TEX-N-31\"/></g><g data-mml-node=\"mo\" transform=\"translate(7682, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(7960, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mn\" transform=\"translate(8238, 0)\"><use xlink:href=\"#MJX-TEX-N-30\"/></g><g data-mml-node=\"mo\" transform=\"translate(8738, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(9238.2, 0)\"><use xlink:href=\"#MJX-TEX-N-2B\"/></g><g data-mml-node=\"mi\" transform=\"translate(10238.4, 0)\"><use xlink:href=\"#MJX-TEX-I-6E\"/></g><g data-mml-node=\"mi\" transform=\"translate(10838.4, 0)\"><use xlink:href=\"#MJX-TEX-I-75\"/></g><g data-mml-node=\"mi\" transform=\"translate(11410.4, 0)\"><use xlink:href=\"#MJX-TEX-I-6D\"/></g><g data-mml-node=\"msub\" transform=\"translate(12288.4, 0)\"><g data-mml-node=\"mi\"><use xlink:href=\"#MJX-TEX-I-73\"/></g><g data-mml-node=\"mi\" transform=\"translate(469, -150) scale(0.707)\"><use xlink:href=\"#MJX-TEX-I-69\"/></g></g></g></g></svg></mjx-container></p>\n<p>不接受当前预约的话,上一个预约接不接受都可以,<mjx-container class=\"MathJax\" jax=\"SVG\"><svg style=\"vertical-align: -0.566ex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"38.281ex\" height=\"2.262ex\" role=\"img\" focusable=\"false\" viewbox=\"0 -750 16920.1 1000\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"matrix(1 0 0 -1 0 0)\"><g data-mml-node=\"math\"><g data-mml-node=\"mi\"><use xlink:href=\"#MJX-TEX-I-64\"/></g><g data-mml-node=\"mi\" transform=\"translate(520, 0)\"><use xlink:href=\"#MJX-TEX-I-70\"/></g><g data-mml-node=\"mo\" transform=\"translate(1023, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mi\" transform=\"translate(1301, 0)\"><use xlink:href=\"#MJX-TEX-I-69\"/></g><g data-mml-node=\"mo\" transform=\"translate(1646, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(1924, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mn\" transform=\"translate(2202, 0)\"><use xlink:href=\"#MJX-TEX-N-30\"/></g><g data-mml-node=\"mo\" transform=\"translate(2702, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(3257.8, 0)\"><use xlink:href=\"#MJX-TEX-N-3D\"/></g><g data-mml-node=\"mi\" transform=\"translate(4313.6, 0)\"><use xlink:href=\"#MJX-TEX-I-6D\"/></g><g data-mml-node=\"mi\" transform=\"translate(5191.6, 0)\"><use xlink:href=\"#MJX-TEX-I-61\"/></g><g data-mml-node=\"mi\" transform=\"translate(5720.6, 0)\"><use xlink:href=\"#MJX-TEX-I-78\"/></g><g data-mml-node=\"mo\" transform=\"translate(6292.6, 0)\"><use xlink:href=\"#MJX-TEX-N-28\"/></g><g data-mml-node=\"mi\" transform=\"translate(6681.6, 0)\"><use xlink:href=\"#MJX-TEX-I-64\"/></g><g data-mml-node=\"mi\" transform=\"translate(7201.6, 0)\"><use xlink:href=\"#MJX-TEX-I-70\"/></g><g data-mml-node=\"mo\" transform=\"translate(7704.6, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mi\" transform=\"translate(7982.6, 0)\"><use xlink:href=\"#MJX-TEX-I-69\"/></g><g data-mml-node=\"mo\" transform=\"translate(8549.8, 0)\"><use xlink:href=\"#MJX-TEX-N-2212\"/></g><g data-mml-node=\"mn\" transform=\"translate(9550, 0)\"><use xlink:href=\"#MJX-TEX-N-31\"/></g><g data-mml-node=\"mo\" transform=\"translate(10050, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(10328, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mn\" transform=\"translate(10606, 0)\"><use xlink:href=\"#MJX-TEX-N-30\"/></g><g data-mml-node=\"mo\" transform=\"translate(11106, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(11384, 0)\"><use xlink:href=\"#MJX-TEX-N-2C\"/></g><g data-mml-node=\"mi\" transform=\"translate(11828.7, 0)\"><use xlink:href=\"#MJX-TEX-I-64\"/></g><g data-mml-node=\"mi\" transform=\"translate(12348.7, 0)\"><use xlink:href=\"#MJX-TEX-I-70\"/></g><g data-mml-node=\"mo\" transform=\"translate(12851.7, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mi\" transform=\"translate(13129.7, 0)\"><use xlink:href=\"#MJX-TEX-I-69\"/></g><g data-mml-node=\"mo\" transform=\"translate(13696.9, 0)\"><use xlink:href=\"#MJX-TEX-N-2212\"/></g><g data-mml-node=\"mn\" transform=\"translate(14697.1, 0)\"><use xlink:href=\"#MJX-TEX-N-31\"/></g><g data-mml-node=\"mo\" transform=\"translate(15197.1, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(15475.1, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mn\" transform=\"translate(15753.1, 0)\"><use xlink:href=\"#MJX-TEX-N-31\"/></g><g data-mml-node=\"mo\" transform=\"translate(16253.1, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(16531.1, 0)\"><use xlink:href=\"#MJX-TEX-N-29\"/></g></g></g></svg></mjx-container></p>\n<p>最后只要比较两种情况即可 <mjx-container class=\"MathJax\" jax=\"SVG\"><svg style=\"vertical-align: -0.566ex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20.728ex\" height=\"2.262ex\" role=\"img\" focusable=\"false\" viewbox=\"0 -750 9161.7 1000\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"matrix(1 0 0 -1 0 0)\"><g data-mml-node=\"math\"><g data-mml-node=\"mi\"><use xlink:href=\"#MJX-TEX-I-6D\"/></g><g data-mml-node=\"mi\" transform=\"translate(878, 0)\"><use xlink:href=\"#MJX-TEX-I-61\"/></g><g data-mml-node=\"mi\" transform=\"translate(1407, 0)\"><use xlink:href=\"#MJX-TEX-I-78\"/></g><g data-mml-node=\"mo\" transform=\"translate(1979, 0)\"><use xlink:href=\"#MJX-TEX-N-28\"/></g><g data-mml-node=\"mi\" transform=\"translate(2368, 0)\"><use xlink:href=\"#MJX-TEX-I-64\"/></g><g data-mml-node=\"mi\" transform=\"translate(2888, 0)\"><use xlink:href=\"#MJX-TEX-I-70\"/></g><g data-mml-node=\"mo\" transform=\"translate(3391, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mi\" transform=\"translate(3669, 0)\"><use xlink:href=\"#MJX-TEX-I-69\"/></g><g data-mml-node=\"mo\" transform=\"translate(4014, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(4292, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mn\" transform=\"translate(4570, 0)\"><use xlink:href=\"#MJX-TEX-N-30\"/></g><g data-mml-node=\"mo\" transform=\"translate(5070, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(5348, 0)\"><use xlink:href=\"#MJX-TEX-N-2C\"/></g><g data-mml-node=\"mi\" transform=\"translate(5792.7, 0)\"><use xlink:href=\"#MJX-TEX-I-64\"/></g><g data-mml-node=\"mi\" transform=\"translate(6312.7, 0)\"><use xlink:href=\"#MJX-TEX-I-70\"/></g><g data-mml-node=\"mo\" transform=\"translate(6815.7, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mi\" transform=\"translate(7093.7, 0)\"><use xlink:href=\"#MJX-TEX-I-69\"/></g><g data-mml-node=\"mo\" transform=\"translate(7438.7, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(7716.7, 0)\"><use xlink:href=\"#MJX-TEX-N-5B\"/></g><g data-mml-node=\"mn\" transform=\"translate(7994.7, 0)\"><use xlink:href=\"#MJX-TEX-N-31\"/></g><g data-mml-node=\"mo\" transform=\"translate(8494.7, 0)\"><use xlink:href=\"#MJX-TEX-N-5D\"/></g><g data-mml-node=\"mo\" transform=\"translate(8772.7, 0)\"><use xlink:href=\"#MJX-TEX-N-29\"/></g></g></g></svg></mjx-container></p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">massage</span><span class=\"params\">(self, nums)</span> -&gt; int:</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> nums:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"number\">0</span></span><br><span class=\"line\"> n = len(nums)</span><br><span class=\"line\"> not_choose = <span class=\"number\">0</span></span><br><span class=\"line\"> choose = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> n <span class=\"keyword\">in</span> nums:</span><br><span class=\"line\"> not_choose, choose = max(not_choose, choose), not_choose+n</span><br><span class=\"line\"> <span class=\"keyword\">return</span> max(not_choose, choose)</span><br><span class=\"line\"> <span class=\"comment\"># 52 ms\t13.6 MB</span></span><br></pre></td></tr></table></figure>\n<p>这种问题原来有个名字叫<a href=\"https://zh.wikipedia.org/wiki/动态规划\" target=\"_blank\" rel=\"noopener\">动态规划</a>,上面推导的方程叫<a href=\"https://baike.baidu.com/item/状态转移方程\" target=\"_blank\" rel=\"noopener\">状态转移方程</a>,可以找找资料来看一下。</p>\n<svg style=\"display: none\" id=\"MJX-SVG-global-cache\"><defs><path id=\"MJX-TEX-I-69\" d=\"M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z\"/><path id=\"MJX-TEX-I-64\" d=\"M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z\"/><path id=\"MJX-TEX-I-70\" d=\"M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z\"/><path id=\"MJX-TEX-N-5B\" d=\"M118 -250V750H255V710H158V-210H255V-250H118Z\"/><path id=\"MJX-TEX-N-5D\" d=\"M22 710V750H159V-250H22V-210H119V710H22Z\"/><path id=\"MJX-TEX-N-30\" d=\"M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z\"/><path id=\"MJX-TEX-N-31\" d=\"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z\"/><path id=\"MJX-TEX-N-3D\" d=\"M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z\"/><path id=\"MJX-TEX-N-2212\" d=\"M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z\"/><path id=\"MJX-TEX-N-2B\" d=\"M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z\"/><path id=\"MJX-TEX-I-6E\" d=\"M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z\"/><path id=\"MJX-TEX-I-75\" d=\"M21 287Q21 295 30 318T55 370T99 420T158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27T291 44T328 78L339 95Q341 99 377 247Q407 367 413 387T427 416Q444 431 463 431Q480 431 488 421T496 402L420 84Q419 79 419 68Q419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153Q551 153 551 144Q550 139 549 130T540 98T523 55T498 17T462 -8Q454 -10 438 -10Q372 -10 347 46Q345 45 336 36T318 21T296 6T267 -6T233 -11Q189 -11 155 7Q103 38 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z\"/><path id=\"MJX-TEX-I-6D\" d=\"M21 287Q22 293 24 303T36 341T56 388T88 425T132 442T175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q303 442 384 442Q401 442 415 440T441 433T460 423T475 411T485 398T493 385T497 373T500 364T502 357L510 367Q573 442 659 442Q713 442 746 415T780 336Q780 285 742 178T704 50Q705 36 709 31T724 26Q752 26 776 56T815 138Q818 149 821 151T837 153Q857 153 857 145Q857 144 853 130Q845 101 831 73T785 17T716 -10Q669 -10 648 17T627 73Q627 92 663 193T700 345Q700 404 656 404H651Q565 404 506 303L499 291L466 157Q433 26 428 16Q415 -11 385 -11Q372 -11 364 -4T353 8T350 18Q350 29 384 161L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 181Q151 335 151 342Q154 357 154 369Q154 405 129 405Q107 405 92 377T69 316T57 280Q55 278 41 278H27Q21 284 21 287Z\"/><path id=\"MJX-TEX-I-73\" d=\"M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z\"/><path id=\"MJX-TEX-I-61\" d=\"M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z\"/><path id=\"MJX-TEX-I-78\" d=\"M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z\"/><path id=\"MJX-TEX-N-28\" d=\"M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z\"/><path id=\"MJX-TEX-N-2C\" d=\"M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z\"/><path id=\"MJX-TEX-N-29\" d=\"M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z\"/></defs></svg>"},{"title":"leetcode-01-matrix","date":"2020-04-16T04:26:34.000Z","_content":"\n### 542. 01 矩阵\n\n[题目](https://leetcode-cn.com/problems/01-matrix/)\n\n\n\n<!--more-->\n\n\n\n想了两种思路\n\n1. 0 位置的上下左右是 1 上下左右中有跟 1 相邻的就是 2以此类推从 0 的坐标开始往上下左右四个方向扩散。如果我们把同意个距离的看作是一层,可以用一个队列依次存放每一层的坐标,直至每个坐标都被计算过。\n\n ```python\n class Solution:\n def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:\n m, n = len(matrix), len(matrix[0])\n dist = [[0] * n for _ in range(m)]\n zeroes_pos = [(i, j) for i in range(m) for j in range(n) if matrix[i][j] == 0]\n # 将所有的 0 添加进初始队列中\n q = collections.deque(zeroes_pos)\n seen = set(zeroes_pos)\n\n # 广度优先搜索\n while q:\n i, j = q.popleft()\n for ni, nj in [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)]:\n if 0 <= ni < m and 0 <= nj < n and (ni, nj) not in seen:\n dist[ni][nj] = dist[i][j] + 1\n q.append((ni, nj))\n seen.add((ni, nj))\n\n return dist\n ```\n\n\n\n2. 从左上角开往右下角遍历矩阵,当前坐标的距离由左和上两个位置的值确定。遍历一遍后,再反过来从右下角开始往左上角遍历,当前坐标的距离根据右和下两个位置的值确定,比较这两次得出的值中较小的一个即为该点的距离。\n\n","source":"_posts/2020-04-16-leetcode-01-matrix.md","raw":"---\ntitle: leetcode-01-matrix\ndate: 2020-04-16 12:26:34\ntags:\ncategories: leetcode\n---\n\n### 542. 01 矩阵\n\n[题目](https://leetcode-cn.com/problems/01-matrix/)\n\n\n\n<!--more-->\n\n\n\n想了两种思路\n\n1. 0 位置的上下左右是 1 上下左右中有跟 1 相邻的就是 2以此类推从 0 的坐标开始往上下左右四个方向扩散。如果我们把同意个距离的看作是一层,可以用一个队列依次存放每一层的坐标,直至每个坐标都被计算过。\n\n ```python\n class Solution:\n def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:\n m, n = len(matrix), len(matrix[0])\n dist = [[0] * n for _ in range(m)]\n zeroes_pos = [(i, j) for i in range(m) for j in range(n) if matrix[i][j] == 0]\n # 将所有的 0 添加进初始队列中\n q = collections.deque(zeroes_pos)\n seen = set(zeroes_pos)\n\n # 广度优先搜索\n while q:\n i, j = q.popleft()\n for ni, nj in [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)]:\n if 0 <= ni < m and 0 <= nj < n and (ni, nj) not in seen:\n dist[ni][nj] = dist[i][j] + 1\n q.append((ni, nj))\n seen.add((ni, nj))\n\n return dist\n ```\n\n\n\n2. 从左上角开往右下角遍历矩阵,当前坐标的距离由左和上两个位置的值确定。遍历一遍后,再反过来从右下角开始往左上角遍历,当前坐标的距离根据右和下两个位置的值确定,比较这两次得出的值中较小的一个即为该点的距离。\n\n","slug":"leetcode-01-matrix","published":1,"updated":"2020-04-16T04:26:56.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4w000zsubuceivn0ao","content":"<h3 id=\"542-_01__u77E9_u9635\"><a href=\"#542-_01__u77E9_u9635\" class=\"headerlink\" title=\"542. 01 矩阵\"></a>542. 01 矩阵</h3><p><a href=\"https://leetcode-cn.com/problems/01-matrix/\" target=\"_blank\" rel=\"noopener\">题目</a></p>\n<a id=\"more\"></a>\n<p>想了两种思路</p>\n<ol>\n<li><p>0 位置的上下左右是 1 上下左右中有跟 1 相邻的就是 2以此类推从 0 的坐标开始往上下左右四个方向扩散。如果我们把同意个距离的看作是一层,可以用一个队列依次存放每一层的坐标,直至每个坐标都被计算过。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">updateMatrix</span><span class=\"params\">(self, matrix: List[List[int]])</span> -&gt; List[List[int]]:</span></span><br><span class=\"line\"> m, n = len(matrix), len(matrix[<span class=\"number\">0</span>])</span><br><span class=\"line\"> dist = [[<span class=\"number\">0</span>] * n <span class=\"keyword\">for</span> _ <span class=\"keyword\">in</span> range(m)]</span><br><span class=\"line\"> zeroes_pos = [(i, j) <span class=\"keyword\">for</span> i <span class=\"keyword\">in</span> range(m) <span class=\"keyword\">for</span> j <span class=\"keyword\">in</span> range(n) <span class=\"keyword\">if</span> matrix[i][j] == <span class=\"number\">0</span>]</span><br><span class=\"line\"> <span class=\"comment\"># 将所有的 0 添加进初始队列中</span></span><br><span class=\"line\"> q = collections.deque(zeroes_pos)</span><br><span class=\"line\"> seen = set(zeroes_pos)</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"comment\"># 广度优先搜索</span></span><br><span class=\"line\"> <span class=\"keyword\">while</span> q:</span><br><span class=\"line\"> i, j = q.popleft()</span><br><span class=\"line\"> <span class=\"keyword\">for</span> ni, nj <span class=\"keyword\">in</span> [(i - <span class=\"number\">1</span>, j), (i + <span class=\"number\">1</span>, j), (i, j - <span class=\"number\">1</span>), (i, j + <span class=\"number\">1</span>)]:</span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"number\">0</span> &lt;= ni &lt; m <span class=\"keyword\">and</span> <span class=\"number\">0</span> &lt;= nj &lt; n <span class=\"keyword\">and</span> (ni, nj) <span class=\"keyword\">not</span> <span class=\"keyword\">in</span> seen:</span><br><span class=\"line\"> dist[ni][nj] = dist[i][j] + <span class=\"number\">1</span></span><br><span class=\"line\"> q.append((ni, nj))</span><br><span class=\"line\"> seen.add((ni, nj))</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"keyword\">return</span> dist</span><br></pre></td></tr></table></figure>\n</li>\n<li><p>从左上角开往右下角遍历矩阵,当前坐标的距离由左和上两个位置的值确定。遍历一遍后,再反过来从右下角开始往左上角遍历,当前坐标的距离根据右和下两个位置的值确定,比较这两次得出的值中较小的一个即为该点的距离。</p>\n</li>\n</ol>\n","site":{"data":{}},"excerpt":"<h3 id=\"542-_01__u77E9_u9635\"><a href=\"#542-_01__u77E9_u9635\" class=\"headerlink\" title=\"542. 01 矩阵\"></a>542. 01 矩阵</h3><p><a href=\"https://leetcode-cn.com/problems/01-matrix/\" target=\"_blank\" rel=\"noopener\">题目</a></p>","more":"<p>想了两种思路</p>\n<ol>\n<li><p>0 位置的上下左右是 1 上下左右中有跟 1 相邻的就是 2以此类推从 0 的坐标开始往上下左右四个方向扩散。如果我们把同意个距离的看作是一层,可以用一个队列依次存放每一层的坐标,直至每个坐标都被计算过。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">updateMatrix</span><span class=\"params\">(self, matrix: List[List[int]])</span> -&gt; List[List[int]]:</span></span><br><span class=\"line\"> m, n = len(matrix), len(matrix[<span class=\"number\">0</span>])</span><br><span class=\"line\"> dist = [[<span class=\"number\">0</span>] * n <span class=\"keyword\">for</span> _ <span class=\"keyword\">in</span> range(m)]</span><br><span class=\"line\"> zeroes_pos = [(i, j) <span class=\"keyword\">for</span> i <span class=\"keyword\">in</span> range(m) <span class=\"keyword\">for</span> j <span class=\"keyword\">in</span> range(n) <span class=\"keyword\">if</span> matrix[i][j] == <span class=\"number\">0</span>]</span><br><span class=\"line\"> <span class=\"comment\"># 将所有的 0 添加进初始队列中</span></span><br><span class=\"line\"> q = collections.deque(zeroes_pos)</span><br><span class=\"line\"> seen = set(zeroes_pos)</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"comment\"># 广度优先搜索</span></span><br><span class=\"line\"> <span class=\"keyword\">while</span> q:</span><br><span class=\"line\"> i, j = q.popleft()</span><br><span class=\"line\"> <span class=\"keyword\">for</span> ni, nj <span class=\"keyword\">in</span> [(i - <span class=\"number\">1</span>, j), (i + <span class=\"number\">1</span>, j), (i, j - <span class=\"number\">1</span>), (i, j + <span class=\"number\">1</span>)]:</span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"number\">0</span> &lt;= ni &lt; m <span class=\"keyword\">and</span> <span class=\"number\">0</span> &lt;= nj &lt; n <span class=\"keyword\">and</span> (ni, nj) <span class=\"keyword\">not</span> <span class=\"keyword\">in</span> seen:</span><br><span class=\"line\"> dist[ni][nj] = dist[i][j] + <span class=\"number\">1</span></span><br><span class=\"line\"> q.append((ni, nj))</span><br><span class=\"line\"> seen.add((ni, nj))</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"keyword\">return</span> dist</span><br></pre></td></tr></table></figure>\n</li>\n<li><p>从左上角开往右下角遍历矩阵,当前坐标的距离由左和上两个位置的值确定。遍历一遍后,再反过来从右下角开始往左上角遍历,当前坐标的距离根据右和下两个位置的值确定,比较这两次得出的值中较小的一个即为该点的距离。</p>\n</li>\n</ol>"},{"title":"leetcode-design-twitter","date":"2020-04-14T08:11:41.000Z","_content":"\n### 355. 设计推特\n\n[题目](https://leetcode-cn.com/problems/design-twitter/)\n\n\n<!--more-->\n\n\n做出来倒是很简单由于没有并发和特别的条件测试数据量也不大。一开始搞错了以为传入的 `twitterId` 就是自增的 id结果其实是每条推的内容所以增加了一个计数器去标记 id。\n\n主要的考点应该是 `多路归并` 这个东西。我用的是排序,在数据量大的时候应该会有些问题。\n\n\n\n```python\nclass Twitter:\n\n def __init__(self):\n \"\"\"\n Initialize your data structure here.\n \"\"\"\n self.tweets = {}\n self.followers = {}\n self._tid = 0\n\n\n def postTweet(self, userId: int, tweetId: int) -> None:\n \"\"\"\n Compose a new tweet.\n \"\"\"\n if not self.tweets.get(userId):\n self.tweets[userId] = []\n self.tweets[userId].append((self._tid, tweetId))\n self._tid += 1\n\n\n def getNewsFeed(self, userId: int) :\n \"\"\"\n Retrieve the 10 most recent tweet ids in the user's news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent.\n \"\"\"\n foers = self.followers.get(userId, set())\n foers = foers.union((userId,))\n tweets = []\n for fo in foers:\n tweets.extend(self.tweets.get(fo, [])[-10:])\n return [tw[1] for tw in sorted(tweets, reverse=True)[:10]]\n\n\n def follow(self, followerId: int, followeeId: int) -> None:\n \"\"\"\n Follower follows a followee. If the operation is invalid, it should be a no-op.\n \"\"\"\n if not self.followers.get(followerId):\n self.followers[followerId] = set()\n self.followers[followerId].add(followeeId)\n\n\n def unfollow(self, followerId: int, followeeId: int) -> None:\n \"\"\"\n Follower unfollows a followee. If the operation is invalid, it should be a no-op.\n \"\"\"\n if not self.followers.get(followerId):\n self.followers[followerId] = set()\n if followeeId in self.followers[followerId]:\n self.followers[followerId].remove(followeeId)\n\n#100 ms\t19.2 MB\n\n# Your Twitter object will be instantiated and called as such:\n# obj = Twitter()\n# obj.postTweet(userId,tweetId)\n# param_2 = obj.getNewsFeed(userId)\n# obj.follow(followerId,followeeId)\n# obj.unfollow(followerId,followeeId)\n```\n\n","source":"_posts/2020-04-14-leetcode-design-twitter.md","raw":"---\ntitle: leetcode-design-twitter\ndate: 2020-04-14 16:11:41\ntags:\ncategories: leetcode\n---\n\n### 355. 设计推特\n\n[题目](https://leetcode-cn.com/problems/design-twitter/)\n\n\n<!--more-->\n\n\n做出来倒是很简单由于没有并发和特别的条件测试数据量也不大。一开始搞错了以为传入的 `twitterId` 就是自增的 id结果其实是每条推的内容所以增加了一个计数器去标记 id。\n\n主要的考点应该是 `多路归并` 这个东西。我用的是排序,在数据量大的时候应该会有些问题。\n\n\n\n```python\nclass Twitter:\n\n def __init__(self):\n \"\"\"\n Initialize your data structure here.\n \"\"\"\n self.tweets = {}\n self.followers = {}\n self._tid = 0\n\n\n def postTweet(self, userId: int, tweetId: int) -> None:\n \"\"\"\n Compose a new tweet.\n \"\"\"\n if not self.tweets.get(userId):\n self.tweets[userId] = []\n self.tweets[userId].append((self._tid, tweetId))\n self._tid += 1\n\n\n def getNewsFeed(self, userId: int) :\n \"\"\"\n Retrieve the 10 most recent tweet ids in the user's news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent.\n \"\"\"\n foers = self.followers.get(userId, set())\n foers = foers.union((userId,))\n tweets = []\n for fo in foers:\n tweets.extend(self.tweets.get(fo, [])[-10:])\n return [tw[1] for tw in sorted(tweets, reverse=True)[:10]]\n\n\n def follow(self, followerId: int, followeeId: int) -> None:\n \"\"\"\n Follower follows a followee. If the operation is invalid, it should be a no-op.\n \"\"\"\n if not self.followers.get(followerId):\n self.followers[followerId] = set()\n self.followers[followerId].add(followeeId)\n\n\n def unfollow(self, followerId: int, followeeId: int) -> None:\n \"\"\"\n Follower unfollows a followee. If the operation is invalid, it should be a no-op.\n \"\"\"\n if not self.followers.get(followerId):\n self.followers[followerId] = set()\n if followeeId in self.followers[followerId]:\n self.followers[followerId].remove(followeeId)\n\n#100 ms\t19.2 MB\n\n# Your Twitter object will be instantiated and called as such:\n# obj = Twitter()\n# obj.postTweet(userId,tweetId)\n# param_2 = obj.getNewsFeed(userId)\n# obj.follow(followerId,followeeId)\n# obj.unfollow(followerId,followeeId)\n```\n\n","slug":"leetcode-design-twitter","published":1,"updated":"2020-04-14T15:29:34.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4x0011subuv9wxy1bt","content":"<h3 id=\"355-__u8BBE_u8BA1_u63A8_u7279\"><a href=\"#355-__u8BBE_u8BA1_u63A8_u7279\" class=\"headerlink\" title=\"355. 设计推特\"></a>355. 设计推特</h3><p><a href=\"https://leetcode-cn.com/problems/design-twitter/\" target=\"_blank\" rel=\"noopener\">题目</a></p>\n<a id=\"more\"></a>\n<p>做出来倒是很简单,由于没有并发和特别的条件,测试数据量也不大。一开始搞错了,以为传入的 <code>twitterId</code> 就是自增的 id结果其实是每条推的内容所以增加了一个计数器去标记 id。</p>\n<p>主要的考点应该是 <code>多路归并</code> 这个东西。我用的是排序,在数据量大的时候应该会有些问题。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br><span class=\"line\">42</span><br><span class=\"line\">43</span><br><span class=\"line\">44</span><br><span class=\"line\">45</span><br><span class=\"line\">46</span><br><span class=\"line\">47</span><br><span class=\"line\">48</span><br><span class=\"line\">49</span><br><span class=\"line\">50</span><br><span class=\"line\">51</span><br><span class=\"line\">52</span><br><span class=\"line\">53</span><br><span class=\"line\">54</span><br><span class=\"line\">55</span><br><span class=\"line\">56</span><br><span class=\"line\">57</span><br><span class=\"line\">58</span><br><span class=\"line\">59</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Twitter</span>:</span></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">__init__</span><span class=\"params\">(self)</span>:</span></span><br><span class=\"line\"> <span class=\"string\">\"\"\"</span></span><br><span class=\"line\"><span class=\"string\"> Initialize your data structure here.</span></span><br><span class=\"line\"><span class=\"string\"> \"\"\"</span></span><br><span class=\"line\"> self.tweets = &#123;&#125;</span><br><span class=\"line\"> self.followers = &#123;&#125;</span><br><span class=\"line\"> self._tid = <span class=\"number\">0</span></span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">postTweet</span><span class=\"params\">(self, userId: int, tweetId: int)</span> -&gt; <span class=\"keyword\">None</span>:</span></span><br><span class=\"line\"> <span class=\"string\">\"\"\"</span></span><br><span class=\"line\"><span class=\"string\"> Compose a new tweet.</span></span><br><span class=\"line\"><span class=\"string\"> \"\"\"</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> self.tweets.get(userId):</span><br><span class=\"line\"> self.tweets[userId] = []</span><br><span class=\"line\"> self.tweets[userId].append((self._tid, tweetId))</span><br><span class=\"line\"> self._tid += <span class=\"number\">1</span></span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">getNewsFeed</span><span class=\"params\">(self, userId: int)</span> :</span></span><br><span class=\"line\"> <span class=\"string\">\"\"\"</span></span><br><span class=\"line\"><span class=\"string\"> Retrieve the 10 most recent tweet ids in the user's news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent.</span></span><br><span class=\"line\"><span class=\"string\"> \"\"\"</span></span><br><span class=\"line\"> foers = self.followers.get(userId, set())</span><br><span class=\"line\"> foers = foers.union((userId,))</span><br><span class=\"line\"> tweets = []</span><br><span class=\"line\"> <span class=\"keyword\">for</span> fo <span class=\"keyword\">in</span> foers:</span><br><span class=\"line\"> tweets.extend(self.tweets.get(fo, [])[<span class=\"number\">-10</span>:])</span><br><span class=\"line\"> <span class=\"keyword\">return</span> [tw[<span class=\"number\">1</span>] <span class=\"keyword\">for</span> tw <span class=\"keyword\">in</span> sorted(tweets, reverse=<span class=\"keyword\">True</span>)[:<span class=\"number\">10</span>]]</span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">follow</span><span class=\"params\">(self, followerId: int, followeeId: int)</span> -&gt; <span class=\"keyword\">None</span>:</span></span><br><span class=\"line\"> <span class=\"string\">\"\"\"</span></span><br><span class=\"line\"><span class=\"string\"> Follower follows a followee. If the operation is invalid, it should be a no-op.</span></span><br><span class=\"line\"><span class=\"string\"> \"\"\"</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> self.followers.get(followerId):</span><br><span class=\"line\"> self.followers[followerId] = set()</span><br><span class=\"line\"> self.followers[followerId].add(followeeId)</span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">unfollow</span><span class=\"params\">(self, followerId: int, followeeId: int)</span> -&gt; <span class=\"keyword\">None</span>:</span></span><br><span class=\"line\"> <span class=\"string\">\"\"\"</span></span><br><span class=\"line\"><span class=\"string\"> Follower unfollows a followee. If the operation is invalid, it should be a no-op.</span></span><br><span class=\"line\"><span class=\"string\"> \"\"\"</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> self.followers.get(followerId):</span><br><span class=\"line\"> self.followers[followerId] = set()</span><br><span class=\"line\"> <span class=\"keyword\">if</span> followeeId <span class=\"keyword\">in</span> self.followers[followerId]:</span><br><span class=\"line\"> self.followers[followerId].remove(followeeId)</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\">#100 ms\t19.2 MB</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\"># Your Twitter object will be instantiated and called as such:</span></span><br><span class=\"line\"><span class=\"comment\"># obj = Twitter()</span></span><br><span class=\"line\"><span class=\"comment\"># obj.postTweet(userId,tweetId)</span></span><br><span class=\"line\"><span class=\"comment\"># param_2 = obj.getNewsFeed(userId)</span></span><br><span class=\"line\"><span class=\"comment\"># obj.follow(followerId,followeeId)</span></span><br><span class=\"line\"><span class=\"comment\"># obj.unfollow(followerId,followeeId)</span></span><br></pre></td></tr></table></figure>\n","site":{"data":{}},"excerpt":"<h3 id=\"355-__u8BBE_u8BA1_u63A8_u7279\"><a href=\"#355-__u8BBE_u8BA1_u63A8_u7279\" class=\"headerlink\" title=\"355. 设计推特\"></a>355. 设计推特</h3><p><a href=\"https://leetcode-cn.com/problems/design-twitter/\" target=\"_blank\" rel=\"noopener\">题目</a></p>","more":"<p>做出来倒是很简单,由于没有并发和特别的条件,测试数据量也不大。一开始搞错了,以为传入的 <code>twitterId</code> 就是自增的 id结果其实是每条推的内容所以增加了一个计数器去标记 id。</p>\n<p>主要的考点应该是 <code>多路归并</code> 这个东西。我用的是排序,在数据量大的时候应该会有些问题。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br><span class=\"line\">42</span><br><span class=\"line\">43</span><br><span class=\"line\">44</span><br><span class=\"line\">45</span><br><span class=\"line\">46</span><br><span class=\"line\">47</span><br><span class=\"line\">48</span><br><span class=\"line\">49</span><br><span class=\"line\">50</span><br><span class=\"line\">51</span><br><span class=\"line\">52</span><br><span class=\"line\">53</span><br><span class=\"line\">54</span><br><span class=\"line\">55</span><br><span class=\"line\">56</span><br><span class=\"line\">57</span><br><span class=\"line\">58</span><br><span class=\"line\">59</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Twitter</span>:</span></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">__init__</span><span class=\"params\">(self)</span>:</span></span><br><span class=\"line\"> <span class=\"string\">\"\"\"</span></span><br><span class=\"line\"><span class=\"string\"> Initialize your data structure here.</span></span><br><span class=\"line\"><span class=\"string\"> \"\"\"</span></span><br><span class=\"line\"> self.tweets = &#123;&#125;</span><br><span class=\"line\"> self.followers = &#123;&#125;</span><br><span class=\"line\"> self._tid = <span class=\"number\">0</span></span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">postTweet</span><span class=\"params\">(self, userId: int, tweetId: int)</span> -&gt; <span class=\"keyword\">None</span>:</span></span><br><span class=\"line\"> <span class=\"string\">\"\"\"</span></span><br><span class=\"line\"><span class=\"string\"> Compose a new tweet.</span></span><br><span class=\"line\"><span class=\"string\"> \"\"\"</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> self.tweets.get(userId):</span><br><span class=\"line\"> self.tweets[userId] = []</span><br><span class=\"line\"> self.tweets[userId].append((self._tid, tweetId))</span><br><span class=\"line\"> self._tid += <span class=\"number\">1</span></span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">getNewsFeed</span><span class=\"params\">(self, userId: int)</span> :</span></span><br><span class=\"line\"> <span class=\"string\">\"\"\"</span></span><br><span class=\"line\"><span class=\"string\"> Retrieve the 10 most recent tweet ids in the user's news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent.</span></span><br><span class=\"line\"><span class=\"string\"> \"\"\"</span></span><br><span class=\"line\"> foers = self.followers.get(userId, set())</span><br><span class=\"line\"> foers = foers.union((userId,))</span><br><span class=\"line\"> tweets = []</span><br><span class=\"line\"> <span class=\"keyword\">for</span> fo <span class=\"keyword\">in</span> foers:</span><br><span class=\"line\"> tweets.extend(self.tweets.get(fo, [])[<span class=\"number\">-10</span>:])</span><br><span class=\"line\"> <span class=\"keyword\">return</span> [tw[<span class=\"number\">1</span>] <span class=\"keyword\">for</span> tw <span class=\"keyword\">in</span> sorted(tweets, reverse=<span class=\"keyword\">True</span>)[:<span class=\"number\">10</span>]]</span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">follow</span><span class=\"params\">(self, followerId: int, followeeId: int)</span> -&gt; <span class=\"keyword\">None</span>:</span></span><br><span class=\"line\"> <span class=\"string\">\"\"\"</span></span><br><span class=\"line\"><span class=\"string\"> Follower follows a followee. If the operation is invalid, it should be a no-op.</span></span><br><span class=\"line\"><span class=\"string\"> \"\"\"</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> self.followers.get(followerId):</span><br><span class=\"line\"> self.followers[followerId] = set()</span><br><span class=\"line\"> self.followers[followerId].add(followeeId)</span><br><span class=\"line\"></span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">unfollow</span><span class=\"params\">(self, followerId: int, followeeId: int)</span> -&gt; <span class=\"keyword\">None</span>:</span></span><br><span class=\"line\"> <span class=\"string\">\"\"\"</span></span><br><span class=\"line\"><span class=\"string\"> Follower unfollows a followee. If the operation is invalid, it should be a no-op.</span></span><br><span class=\"line\"><span class=\"string\"> \"\"\"</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> self.followers.get(followerId):</span><br><span class=\"line\"> self.followers[followerId] = set()</span><br><span class=\"line\"> <span class=\"keyword\">if</span> followeeId <span class=\"keyword\">in</span> self.followers[followerId]:</span><br><span class=\"line\"> self.followers[followerId].remove(followeeId)</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\">#100 ms\t19.2 MB</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\"># Your Twitter object will be instantiated and called as such:</span></span><br><span class=\"line\"><span class=\"comment\"># obj = Twitter()</span></span><br><span class=\"line\"><span class=\"comment\"># obj.postTweet(userId,tweetId)</span></span><br><span class=\"line\"><span class=\"comment\"># param_2 = obj.getNewsFeed(userId)</span></span><br><span class=\"line\"><span class=\"comment\"># obj.follow(followerId,followeeId)</span></span><br><span class=\"line\"><span class=\"comment\"># obj.unfollow(followerId,followeeId)</span></span><br></pre></td></tr></table></figure>"},{"title":"leetcode-merge-intervals","date":"2020-04-16T11:22:26.000Z","_content":"\n\n### 56. 合并区间\n\n\n\n[题目](https://leetcode-cn.com/problems/merge-intervals/)\n\n\n\n<!--more-->\n\n\n\n首先将区间按起点由小到大排序这样相邻的两个就能通过终点判断是否重合。\n\n\n\n```python\nclass Solution:\n def merge(self, intervals):\n if not intervals:\n return []\n intervals.sort()\n merged = []\n l = len(intervals)\n m = intervals[0]\n for x in range(l-1):\n j = intervals[x+1]\n if m[1] >= j[0]:\n if m[1] <= j[1]:\n m = [m[0], j[1]]\n else:\n continue\n else:\n merged.append(m)\n m = j\n if m:\n merged.append(m)\n return merged\n```\n\n\n\n","source":"_posts/2020-04-16-leetcode-merge-intervals.md","raw":"---\ntitle: leetcode-merge-intervals\ndate: 2020-04-16 19:22:26\ntags:\ncategories: leetcode\n---\n\n\n### 56. 合并区间\n\n\n\n[题目](https://leetcode-cn.com/problems/merge-intervals/)\n\n\n\n<!--more-->\n\n\n\n首先将区间按起点由小到大排序这样相邻的两个就能通过终点判断是否重合。\n\n\n\n```python\nclass Solution:\n def merge(self, intervals):\n if not intervals:\n return []\n intervals.sort()\n merged = []\n l = len(intervals)\n m = intervals[0]\n for x in range(l-1):\n j = intervals[x+1]\n if m[1] >= j[0]:\n if m[1] <= j[1]:\n m = [m[0], j[1]]\n else:\n continue\n else:\n merged.append(m)\n m = j\n if m:\n merged.append(m)\n return merged\n```\n\n\n\n","slug":"leetcode-merge-intervals","published":1,"updated":"2020-04-16T11:22:48.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4y0013subufp1wokx0","content":"<h3 id=\"56-__u5408_u5E76_u533A_u95F4\"><a href=\"#56-__u5408_u5E76_u533A_u95F4\" class=\"headerlink\" title=\"56. 合并区间\"></a>56. 合并区间</h3><p><a href=\"https://leetcode-cn.com/problems/merge-intervals/\" target=\"_blank\" rel=\"noopener\">题目</a></p>\n<a id=\"more\"></a>\n<p>首先将区间按起点由小到大排序,这样相邻的两个就能通过终点判断是否重合。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">merge</span><span class=\"params\">(self, intervals)</span>:</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> intervals:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> []</span><br><span class=\"line\"> intervals.sort()</span><br><span class=\"line\"> merged = []</span><br><span class=\"line\"> l = len(intervals)</span><br><span class=\"line\"> m = intervals[<span class=\"number\">0</span>]</span><br><span class=\"line\"> <span class=\"keyword\">for</span> x <span class=\"keyword\">in</span> range(l<span class=\"number\">-1</span>):</span><br><span class=\"line\"> j = intervals[x+<span class=\"number\">1</span>]</span><br><span class=\"line\"> <span class=\"keyword\">if</span> m[<span class=\"number\">1</span>] &gt;= j[<span class=\"number\">0</span>]:</span><br><span class=\"line\"> <span class=\"keyword\">if</span> m[<span class=\"number\">1</span>] &lt;= j[<span class=\"number\">1</span>]:</span><br><span class=\"line\"> m = [m[<span class=\"number\">0</span>], j[<span class=\"number\">1</span>]]</span><br><span class=\"line\"> <span class=\"keyword\">else</span>:</span><br><span class=\"line\"> <span class=\"keyword\">continue</span></span><br><span class=\"line\"> <span class=\"keyword\">else</span>:</span><br><span class=\"line\"> merged.append(m)</span><br><span class=\"line\"> m = j</span><br><span class=\"line\"> <span class=\"keyword\">if</span> m:</span><br><span class=\"line\"> merged.append(m)</span><br><span class=\"line\"> <span class=\"keyword\">return</span> merged</span><br></pre></td></tr></table></figure>\n","site":{"data":{}},"excerpt":"<h3 id=\"56-__u5408_u5E76_u533A_u95F4\"><a href=\"#56-__u5408_u5E76_u533A_u95F4\" class=\"headerlink\" title=\"56. 合并区间\"></a>56. 合并区间</h3><p><a href=\"https://leetcode-cn.com/problems/merge-intervals/\" target=\"_blank\" rel=\"noopener\">题目</a></p>","more":"<p>首先将区间按起点由小到大排序,这样相邻的两个就能通过终点判断是否重合。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">merge</span><span class=\"params\">(self, intervals)</span>:</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> intervals:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> []</span><br><span class=\"line\"> intervals.sort()</span><br><span class=\"line\"> merged = []</span><br><span class=\"line\"> l = len(intervals)</span><br><span class=\"line\"> m = intervals[<span class=\"number\">0</span>]</span><br><span class=\"line\"> <span class=\"keyword\">for</span> x <span class=\"keyword\">in</span> range(l<span class=\"number\">-1</span>):</span><br><span class=\"line\"> j = intervals[x+<span class=\"number\">1</span>]</span><br><span class=\"line\"> <span class=\"keyword\">if</span> m[<span class=\"number\">1</span>] &gt;= j[<span class=\"number\">0</span>]:</span><br><span class=\"line\"> <span class=\"keyword\">if</span> m[<span class=\"number\">1</span>] &lt;= j[<span class=\"number\">1</span>]:</span><br><span class=\"line\"> m = [m[<span class=\"number\">0</span>], j[<span class=\"number\">1</span>]]</span><br><span class=\"line\"> <span class=\"keyword\">else</span>:</span><br><span class=\"line\"> <span class=\"keyword\">continue</span></span><br><span class=\"line\"> <span class=\"keyword\">else</span>:</span><br><span class=\"line\"> merged.append(m)</span><br><span class=\"line\"> m = j</span><br><span class=\"line\"> <span class=\"keyword\">if</span> m:</span><br><span class=\"line\"> merged.append(m)</span><br><span class=\"line\"> <span class=\"keyword\">return</span> merged</span><br></pre></td></tr></table></figure>"},{"title":"leetcode-number-of-islands","date":"2020-04-21T04:55:17.000Z","_content":"\n### 200. 岛屿数量\n\n\n\n[题目](https://leetcode-cn.com/problems/number-of-islands/)\n\n\n\n<!--more-->\n\n\n\n这种矩阵题现在第一反应就是用[广度优先搜索][0]做类似之前算和0之间的距离那题。遍历矩阵遇到 1 就将 1 改成 0然后广度优先搜索找出 1 相邻的所有 1这就是一个岛屿以此类推。\n\n\n\n```python\nimport collections\nclass Solution:\n def numIslands(self, grid) -> int:\n rows = len(grid)\n if not rows:\n return 0\n cols = len(grid[0])\n islands = 0\n for r in range(rows):\n for l in range(cols):\n if grid[r][l] == '1':\n islands += 1\n grid[r][l] = '0'\n neighbors = collections.deque([(r, l)])\n while neighbors:\n x, y = neighbors.popleft()\n for x_, y_ in [[x-1, y], [x+1, y], [x, y-1], [x, y+1]]:\n if 0<=x_<rows and 0<=y_<cols and grid[x_][y_] == '1':\n neighbors.append([x_, y_])\n grid[x_][y_] = '0'\n return islands\n```\n\n\n[0]:(https://zh.wikipedia.org/zh-cn/%E5%B9%BF%E5%BA%A6%E4%BC%98%E5%85%88%E6%90%9C%E7%B4%A2)\n","source":"_posts/2020-04-21-leetcode-number-of-islands.md","raw":"---\ntitle: leetcode-number-of-islands\ndate: 2020-04-21 12:55:17\ntags:\ncategories: leetcode\n---\n\n### 200. 岛屿数量\n\n\n\n[题目](https://leetcode-cn.com/problems/number-of-islands/)\n\n\n\n<!--more-->\n\n\n\n这种矩阵题现在第一反应就是用[广度优先搜索][0]做类似之前算和0之间的距离那题。遍历矩阵遇到 1 就将 1 改成 0然后广度优先搜索找出 1 相邻的所有 1这就是一个岛屿以此类推。\n\n\n\n```python\nimport collections\nclass Solution:\n def numIslands(self, grid) -> int:\n rows = len(grid)\n if not rows:\n return 0\n cols = len(grid[0])\n islands = 0\n for r in range(rows):\n for l in range(cols):\n if grid[r][l] == '1':\n islands += 1\n grid[r][l] = '0'\n neighbors = collections.deque([(r, l)])\n while neighbors:\n x, y = neighbors.popleft()\n for x_, y_ in [[x-1, y], [x+1, y], [x, y-1], [x, y+1]]:\n if 0<=x_<rows and 0<=y_<cols and grid[x_][y_] == '1':\n neighbors.append([x_, y_])\n grid[x_][y_] = '0'\n return islands\n```\n\n\n[0]:(https://zh.wikipedia.org/zh-cn/%E5%B9%BF%E5%BA%A6%E4%BC%98%E5%85%88%E6%90%9C%E7%B4%A2)\n","slug":"leetcode-number-of-islands","published":1,"updated":"2020-04-21T04:55:46.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4y0015subub2p4shuv","content":"<h3 id=\"200-__u5C9B_u5C7F_u6570_u91CF\"><a href=\"#200-__u5C9B_u5C7F_u6570_u91CF\" class=\"headerlink\" title=\"200. 岛屿数量\"></a>200. 岛屿数量</h3><p><a href=\"https://leetcode-cn.com/problems/number-of-islands/\" target=\"_blank\" rel=\"noopener\">题目</a></p>\n<a id=\"more\"></a>\n<p>这种矩阵题现在第一反应就是用<a href=\"(https://zh.wikipedia.org/zh-cn/%E5%B9%BF%E5%BA%A6%E4%BC%98%E5%85%88%E6%90%9C%E7%B4%A2)\">广度优先搜索</a>做类似之前算和0之间的距离那题。遍历矩阵遇到 1 就将 1 改成 0然后广度优先搜索找出 1 相邻的所有 1这就是一个岛屿以此类推。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">import</span> collections</span><br><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">numIslands</span><span class=\"params\">(self, grid)</span> -&gt; int:</span></span><br><span class=\"line\"> rows = len(grid)</span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> rows:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"number\">0</span></span><br><span class=\"line\"> cols = len(grid[<span class=\"number\">0</span>])</span><br><span class=\"line\"> islands = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> r <span class=\"keyword\">in</span> range(rows):</span><br><span class=\"line\"> <span class=\"keyword\">for</span> l <span class=\"keyword\">in</span> range(cols):</span><br><span class=\"line\"> <span class=\"keyword\">if</span> grid[r][l] == <span class=\"string\">'1'</span>:</span><br><span class=\"line\"> islands += <span class=\"number\">1</span></span><br><span class=\"line\"> grid[r][l] = <span class=\"string\">'0'</span></span><br><span class=\"line\"> neighbors = collections.deque([(r, l)])</span><br><span class=\"line\"> <span class=\"keyword\">while</span> neighbors:</span><br><span class=\"line\"> x, y = neighbors.popleft()</span><br><span class=\"line\"> <span class=\"keyword\">for</span> x_, y_ <span class=\"keyword\">in</span> [[x<span class=\"number\">-1</span>, y], [x+<span class=\"number\">1</span>, y], [x, y<span class=\"number\">-1</span>], [x, y+<span class=\"number\">1</span>]]:</span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"number\">0</span>&lt;=x_&lt;rows <span class=\"keyword\">and</span> <span class=\"number\">0</span>&lt;=y_&lt;cols <span class=\"keyword\">and</span> grid[x_][y_] == <span class=\"string\">'1'</span>:</span><br><span class=\"line\"> neighbors.append([x_, y_])</span><br><span class=\"line\"> grid[x_][y_] = <span class=\"string\">'0'</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> islands</span><br></pre></td></tr></table></figure>\n","site":{"data":{}},"excerpt":"<h3 id=\"200-__u5C9B_u5C7F_u6570_u91CF\"><a href=\"#200-__u5C9B_u5C7F_u6570_u91CF\" class=\"headerlink\" title=\"200. 岛屿数量\"></a>200. 岛屿数量</h3><p><a href=\"https://leetcode-cn.com/problems/number-of-islands/\" target=\"_blank\" rel=\"noopener\">题目</a></p>","more":"<p>这种矩阵题现在第一反应就是用<a href=\"(https://zh.wikipedia.org/zh-cn/%E5%B9%BF%E5%BA%A6%E4%BC%98%E5%85%88%E6%90%9C%E7%B4%A2)\">广度优先搜索</a>做类似之前算和0之间的距离那题。遍历矩阵遇到 1 就将 1 改成 0然后广度优先搜索找出 1 相邻的所有 1这就是一个岛屿以此类推。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">import</span> collections</span><br><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">numIslands</span><span class=\"params\">(self, grid)</span> -&gt; int:</span></span><br><span class=\"line\"> rows = len(grid)</span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> rows:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"number\">0</span></span><br><span class=\"line\"> cols = len(grid[<span class=\"number\">0</span>])</span><br><span class=\"line\"> islands = <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> r <span class=\"keyword\">in</span> range(rows):</span><br><span class=\"line\"> <span class=\"keyword\">for</span> l <span class=\"keyword\">in</span> range(cols):</span><br><span class=\"line\"> <span class=\"keyword\">if</span> grid[r][l] == <span class=\"string\">'1'</span>:</span><br><span class=\"line\"> islands += <span class=\"number\">1</span></span><br><span class=\"line\"> grid[r][l] = <span class=\"string\">'0'</span></span><br><span class=\"line\"> neighbors = collections.deque([(r, l)])</span><br><span class=\"line\"> <span class=\"keyword\">while</span> neighbors:</span><br><span class=\"line\"> x, y = neighbors.popleft()</span><br><span class=\"line\"> <span class=\"keyword\">for</span> x_, y_ <span class=\"keyword\">in</span> [[x<span class=\"number\">-1</span>, y], [x+<span class=\"number\">1</span>, y], [x, y<span class=\"number\">-1</span>], [x, y+<span class=\"number\">1</span>]]:</span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"number\">0</span>&lt;=x_&lt;rows <span class=\"keyword\">and</span> <span class=\"number\">0</span>&lt;=y_&lt;cols <span class=\"keyword\">and</span> grid[x_][y_] == <span class=\"string\">'1'</span>:</span><br><span class=\"line\"> neighbors.append([x_, y_])</span><br><span class=\"line\"> grid[x_][y_] = <span class=\"string\">'0'</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> islands</span><br></pre></td></tr></table></figure>"},{"title":"leetcode-string-to-integer-atoi","date":"2020-04-16T11:50:10.000Z","_content":"\n### 8. 字符串转换整数 (atoi)\n\n[题目](https://leetcode-cn.com/problems/string-to-integer-atoi/)\n\n\n\n<!--more-->\n\n\n\n没什么好说的注意各种情况识别到数字之后就一直要是数字。\n\n\n\n```python\nclass Solution:\n def myAtoi(self, str: str) -> int:\n p = ''\n str = str.lstrip()\n n = ''\n min_int = -2**31\n max_int = 2**31-1\n isnumeric = False\n for x in str:\n if not isnumeric and x == '-':\n p = '-'\n isnumeric = True\n continue\n if not isnumeric and x == '+':\n isnumeric = True\n continue\n if x.isnumeric():\n n += x\n isnumeric = True\n else:\n break\n if not n:\n return 0\n if int(n) > max_int:\n if p:\n return min_int\n else:\n return max_int\n p += n\n return int(p)\n# 32 ms\t13.6 MB\n```\n\n","source":"_posts/2020-04-16-leetcode-string-to-integer-atoi.md","raw":"---\ntitle: leetcode-string-to-integer-atoi\ndate: 2020-04-16 19:50:10\ntags:\ncategories: leetcode\n---\n\n### 8. 字符串转换整数 (atoi)\n\n[题目](https://leetcode-cn.com/problems/string-to-integer-atoi/)\n\n\n\n<!--more-->\n\n\n\n没什么好说的注意各种情况识别到数字之后就一直要是数字。\n\n\n\n```python\nclass Solution:\n def myAtoi(self, str: str) -> int:\n p = ''\n str = str.lstrip()\n n = ''\n min_int = -2**31\n max_int = 2**31-1\n isnumeric = False\n for x in str:\n if not isnumeric and x == '-':\n p = '-'\n isnumeric = True\n continue\n if not isnumeric and x == '+':\n isnumeric = True\n continue\n if x.isnumeric():\n n += x\n isnumeric = True\n else:\n break\n if not n:\n return 0\n if int(n) > max_int:\n if p:\n return min_int\n else:\n return max_int\n p += n\n return int(p)\n# 32 ms\t13.6 MB\n```\n\n","slug":"leetcode-string-to-integer-atoi","published":1,"updated":"2020-04-16T11:56:40.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk500017subu3v0ql53e","content":"<h3 id=\"8-__u5B57_u7B26_u4E32_u8F6C_u6362_u6574_u6570__28atoi_29\"><a href=\"#8-__u5B57_u7B26_u4E32_u8F6C_u6362_u6574_u6570__28atoi_29\" class=\"headerlink\" title=\"8. 字符串转换整数 (atoi)\"></a>8. 字符串转换整数 (atoi)</h3><p><a href=\"https://leetcode-cn.com/problems/string-to-integer-atoi/\" target=\"_blank\" rel=\"noopener\">题目</a></p>\n<a id=\"more\"></a>\n<p>没什么好说的,注意各种情况,识别到数字之后就一直要是数字。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">myAtoi</span><span class=\"params\">(self, str: str)</span> -&gt; int:</span></span><br><span class=\"line\"> p = <span class=\"string\">''</span></span><br><span class=\"line\"> str = str.lstrip()</span><br><span class=\"line\"> n = <span class=\"string\">''</span></span><br><span class=\"line\"> min_int = <span class=\"number\">-2</span>**<span class=\"number\">31</span></span><br><span class=\"line\"> max_int = <span class=\"number\">2</span>**<span class=\"number\">31</span><span class=\"number\">-1</span></span><br><span class=\"line\"> isnumeric = <span class=\"keyword\">False</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> x <span class=\"keyword\">in</span> str:</span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> isnumeric <span class=\"keyword\">and</span> x == <span class=\"string\">'-'</span>:</span><br><span class=\"line\"> p = <span class=\"string\">'-'</span></span><br><span class=\"line\"> isnumeric = <span class=\"keyword\">True</span></span><br><span class=\"line\"> <span class=\"keyword\">continue</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> isnumeric <span class=\"keyword\">and</span> x == <span class=\"string\">'+'</span>:</span><br><span class=\"line\"> isnumeric = <span class=\"keyword\">True</span></span><br><span class=\"line\"> <span class=\"keyword\">continue</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> x.isnumeric():</span><br><span class=\"line\"> n += x</span><br><span class=\"line\"> isnumeric = <span class=\"keyword\">True</span></span><br><span class=\"line\"> <span class=\"keyword\">else</span>:</span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> n:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> int(n) &gt; max_int:</span><br><span class=\"line\"> <span class=\"keyword\">if</span> p:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> min_int</span><br><span class=\"line\"> <span class=\"keyword\">else</span>:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> max_int</span><br><span class=\"line\"> p += n</span><br><span class=\"line\"> <span class=\"keyword\">return</span> int(p)</span><br><span class=\"line\"><span class=\"comment\"># 32 ms\t13.6 MB</span></span><br></pre></td></tr></table></figure>\n","site":{"data":{}},"excerpt":"<h3 id=\"8-__u5B57_u7B26_u4E32_u8F6C_u6362_u6574_u6570__28atoi_29\"><a href=\"#8-__u5B57_u7B26_u4E32_u8F6C_u6362_u6574_u6570__28atoi_29\" class=\"headerlink\" title=\"8. 字符串转换整数 (atoi)\"></a>8. 字符串转换整数 (atoi)</h3><p><a href=\"https://leetcode-cn.com/problems/string-to-integer-atoi/\" target=\"_blank\" rel=\"noopener\">题目</a></p>","more":"<p>没什么好说的,注意各种情况,识别到数字之后就一直要是数字。</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Solution</span>:</span></span><br><span class=\"line\"> <span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">myAtoi</span><span class=\"params\">(self, str: str)</span> -&gt; int:</span></span><br><span class=\"line\"> p = <span class=\"string\">''</span></span><br><span class=\"line\"> str = str.lstrip()</span><br><span class=\"line\"> n = <span class=\"string\">''</span></span><br><span class=\"line\"> min_int = <span class=\"number\">-2</span>**<span class=\"number\">31</span></span><br><span class=\"line\"> max_int = <span class=\"number\">2</span>**<span class=\"number\">31</span><span class=\"number\">-1</span></span><br><span class=\"line\"> isnumeric = <span class=\"keyword\">False</span></span><br><span class=\"line\"> <span class=\"keyword\">for</span> x <span class=\"keyword\">in</span> str:</span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> isnumeric <span class=\"keyword\">and</span> x == <span class=\"string\">'-'</span>:</span><br><span class=\"line\"> p = <span class=\"string\">'-'</span></span><br><span class=\"line\"> isnumeric = <span class=\"keyword\">True</span></span><br><span class=\"line\"> <span class=\"keyword\">continue</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> isnumeric <span class=\"keyword\">and</span> x == <span class=\"string\">'+'</span>:</span><br><span class=\"line\"> isnumeric = <span class=\"keyword\">True</span></span><br><span class=\"line\"> <span class=\"keyword\">continue</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> x.isnumeric():</span><br><span class=\"line\"> n += x</span><br><span class=\"line\"> isnumeric = <span class=\"keyword\">True</span></span><br><span class=\"line\"> <span class=\"keyword\">else</span>:</span><br><span class=\"line\"> <span class=\"keyword\">break</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">not</span> n:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"number\">0</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> int(n) &gt; max_int:</span><br><span class=\"line\"> <span class=\"keyword\">if</span> p:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> min_int</span><br><span class=\"line\"> <span class=\"keyword\">else</span>:</span><br><span class=\"line\"> <span class=\"keyword\">return</span> max_int</span><br><span class=\"line\"> p += n</span><br><span class=\"line\"> <span class=\"keyword\">return</span> int(p)</span><br><span class=\"line\"><span class=\"comment\"># 32 ms\t13.6 MB</span></span><br></pre></td></tr></table></figure>"},{"title":"Postgresql Partitioning","date":"2019-03-11T16:08:48.000Z","_content":"\n`Partitioning` refers to splitting what is logically one large table inot smaller physical pieces.\n\nCurrently, PostgreSQL supports partitioning via table [inheritance](https://www.postgresql.org/docs/9.6/ddl-inherit.html). Each partition must be created as a child table of a single parent table. **The parent table itself is normally empty**; It exists just to represent the entire data set.\n\nThere are two forms of partitioning can be implemented in PostgreSQL:\n\n* Range Partitioning\n\n \tThe table is partitioning into \"range\" defined by a key column or a set of columns, with no overlap between the ranges of values assigned to different partitions. eg. partition by date ranges or by identifiers.\n\n* List Partitioning\n\n \tThe table is partitioned by explicitly listing which key values appear in each partition.\n\n### Implementing Partitioning\n\n1. Create the \"master\" / \"parent\" table, from which all the partitions will inherit.\n\n \tThis table will not contain any data. Do not define any check on this table, unless you intend them to be applied equally to all partitions. There is no point in defining any indexes or unique constraints on it either.\n\n2. Create \"child\" tables that each inherit form the master table. Normally, these tables will not add any columns to the set inherited from the master. \n\n3. Add table constraints to the partition tables to define the allowed key values in each partitions. \n\n \tEnsure that the constraints guarantee that there is no overlap between the key values premitted in different partitions. And there is no difference in syntax between range and list partitioning. \n\n4. Create indexes on column(s) for each partitions.\n\n5. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.\n\n6. Ensure hte [constraint_exclusion](https://www.postgresql.org/docs/9.6/runtime-config-query.html#GUC-CONSTRAINT-EXCLUSION) configuration parameter is not disabled in `postgresql.conf`. If it is, queries will not be optimized as desired.\n\n### Trigger\n\nAs we are creating new table and hopping data insered to right partition, a trigger function and a trigger are needed.\n\n","source":"_posts/Postgresql Partitioning.md","raw":"---\ntitle: Postgresql Partitioning\ndate: 2019-03-12 00:08:48\ntags:\n---\n\n`Partitioning` refers to splitting what is logically one large table inot smaller physical pieces.\n\nCurrently, PostgreSQL supports partitioning via table [inheritance](https://www.postgresql.org/docs/9.6/ddl-inherit.html). Each partition must be created as a child table of a single parent table. **The parent table itself is normally empty**; It exists just to represent the entire data set.\n\nThere are two forms of partitioning can be implemented in PostgreSQL:\n\n* Range Partitioning\n\n \tThe table is partitioning into \"range\" defined by a key column or a set of columns, with no overlap between the ranges of values assigned to different partitions. eg. partition by date ranges or by identifiers.\n\n* List Partitioning\n\n \tThe table is partitioned by explicitly listing which key values appear in each partition.\n\n### Implementing Partitioning\n\n1. Create the \"master\" / \"parent\" table, from which all the partitions will inherit.\n\n \tThis table will not contain any data. Do not define any check on this table, unless you intend them to be applied equally to all partitions. There is no point in defining any indexes or unique constraints on it either.\n\n2. Create \"child\" tables that each inherit form the master table. Normally, these tables will not add any columns to the set inherited from the master. \n\n3. Add table constraints to the partition tables to define the allowed key values in each partitions. \n\n \tEnsure that the constraints guarantee that there is no overlap between the key values premitted in different partitions. And there is no difference in syntax between range and list partitioning. \n\n4. Create indexes on column(s) for each partitions.\n\n5. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.\n\n6. Ensure hte [constraint_exclusion](https://www.postgresql.org/docs/9.6/runtime-config-query.html#GUC-CONSTRAINT-EXCLUSION) configuration parameter is not disabled in `postgresql.conf`. If it is, queries will not be optimized as desired.\n\n### Trigger\n\nAs we are creating new table and hopping data insered to right partition, a trigger function and a trigger are needed.\n\n","slug":"Postgresql-Partitioning","published":1,"updated":"2019-11-14T08:01:50.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk510019subuzokyjrq6","content":"<p><code>Partitioning</code> refers to splitting what is logically one large table inot smaller physical pieces.</p>\n<p>Currently, PostgreSQL supports partitioning via table <a href=\"https://www.postgresql.org/docs/9.6/ddl-inherit.html\" target=\"_blank\" rel=\"noopener\">inheritance</a>. Each partition must be created as a child table of a single parent table. <strong>The parent table itself is normally empty</strong>; It exists just to represent the entire data set.</p>\n<p>There are two forms of partitioning can be implemented in PostgreSQL:</p>\n<ul>\n<li><p>Range Partitioning</p>\n<p> The table is partitioning into “range” defined by a key column or a set of columns, with no overlap between the ranges of values assigned to different partitions. eg. partition by date ranges or by identifiers.</p>\n</li>\n<li><p>List Partitioning</p>\n<p> The table is partitioned by explicitly listing which key values appear in each partition.</p>\n</li>\n</ul>\n<h3 id=\"Implementing_Partitioning\"><a href=\"#Implementing_Partitioning\" class=\"headerlink\" title=\"Implementing Partitioning\"></a>Implementing Partitioning</h3><ol>\n<li><p>Create the “master” / “parent” table, from which all the partitions will inherit.</p>\n<p> This table will not contain any data. Do not define any check on this table, unless you intend them to be applied equally to all partitions. There is no point in defining any indexes or unique constraints on it either.</p>\n</li>\n<li><p>Create “child” tables that each inherit form the master table. Normally, these tables will not add any columns to the set inherited from the master. </p>\n</li>\n<li><p>Add table constraints to the partition tables to define the allowed key values in each partitions. </p>\n<p> Ensure that the constraints guarantee that there is no overlap between the key values premitted in different partitions. And there is no difference in syntax between range and list partitioning. </p>\n</li>\n<li><p>Create indexes on column(s) for each partitions.</p>\n</li>\n<li><p>Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.</p>\n</li>\n<li><p>Ensure hte <a href=\"https://www.postgresql.org/docs/9.6/runtime-config-query.html#GUC-CONSTRAINT-EXCLUSION\" target=\"_blank\" rel=\"noopener\">constraint_exclusion</a> configuration parameter is not disabled in <code>postgresql.conf</code>. If it is, queries will not be optimized as desired.</p>\n</li>\n</ol>\n<h3 id=\"Trigger\"><a href=\"#Trigger\" class=\"headerlink\" title=\"Trigger\"></a>Trigger</h3><p>As we are creating new table and hopping data insered to right partition, a trigger function and a trigger are needed.</p>\n","site":{"data":{}},"excerpt":"","more":"<p><code>Partitioning</code> refers to splitting what is logically one large table inot smaller physical pieces.</p>\n<p>Currently, PostgreSQL supports partitioning via table <a href=\"https://www.postgresql.org/docs/9.6/ddl-inherit.html\" target=\"_blank\" rel=\"noopener\">inheritance</a>. Each partition must be created as a child table of a single parent table. <strong>The parent table itself is normally empty</strong>; It exists just to represent the entire data set.</p>\n<p>There are two forms of partitioning can be implemented in PostgreSQL:</p>\n<ul>\n<li><p>Range Partitioning</p>\n<p> The table is partitioning into “range” defined by a key column or a set of columns, with no overlap between the ranges of values assigned to different partitions. eg. partition by date ranges or by identifiers.</p>\n</li>\n<li><p>List Partitioning</p>\n<p> The table is partitioned by explicitly listing which key values appear in each partition.</p>\n</li>\n</ul>\n<h3 id=\"Implementing_Partitioning\"><a href=\"#Implementing_Partitioning\" class=\"headerlink\" title=\"Implementing Partitioning\"></a>Implementing Partitioning</h3><ol>\n<li><p>Create the “master” / “parent” table, from which all the partitions will inherit.</p>\n<p> This table will not contain any data. Do not define any check on this table, unless you intend them to be applied equally to all partitions. There is no point in defining any indexes or unique constraints on it either.</p>\n</li>\n<li><p>Create “child” tables that each inherit form the master table. Normally, these tables will not add any columns to the set inherited from the master. </p>\n</li>\n<li><p>Add table constraints to the partition tables to define the allowed key values in each partitions. </p>\n<p> Ensure that the constraints guarantee that there is no overlap between the key values premitted in different partitions. And there is no difference in syntax between range and list partitioning. </p>\n</li>\n<li><p>Create indexes on column(s) for each partitions.</p>\n</li>\n<li><p>Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.</p>\n</li>\n<li><p>Ensure hte <a href=\"https://www.postgresql.org/docs/9.6/runtime-config-query.html#GUC-CONSTRAINT-EXCLUSION\" target=\"_blank\" rel=\"noopener\">constraint_exclusion</a> configuration parameter is not disabled in <code>postgresql.conf</code>. If it is, queries will not be optimized as desired.</p>\n</li>\n</ol>\n<h3 id=\"Trigger\"><a href=\"#Trigger\" class=\"headerlink\" title=\"Trigger\"></a>Trigger</h3><p>As we are creating new table and hopping data insered to right partition, a trigger function and a trigger are needed.</p>\n"},{"title":"Django Manager Method","date":"2016-04-24T16:00:01.000Z","_content":"\n\n\n#### Django Manager\n\nDjango 里会为每一个 model 生成一个 Manager默认名字为 objects一般情况下对 model 进行的处理都是通过 model.objects.XXX( ) 来进行的。其实是调用了 model 的 manager 的方法,而 manager 之中的方法是 QuerySet 方法的代理QuerySet 方法是对数据库操作的封装。\n\neg.\n\n```python\nfrom django.db import models\n\nclass Person(models.Model):\n\t...\n\tpeople = models.Manager()\n```\n\n上面这个 model`Person.objects`会产生一个`AttributeError`,但是`Person.people`就可以正常操作。因为默认的 manager 已经变成 peopleobjects 这个 manager 没有重新声明,不起作用。\n\n#### 自定义 Manager\n\n通常需要自定义 manager 的情况有两点:\n\n1. 需要修改/扩展 Django 的 manager 方法\n2. 需要修改返回的 QuerySet\n\n#### 默认 Manager\n\n如果使用自定义的 manager 需要注意的是Django 将 model 中定义的第一个 manager 认为是默认 manager而且 Django 框架中会用到默认 manager。\n\n笨方法是使用自定义 manager 的时候,对于 model 依然提供 objects 这个默认 manager并放在第一个。\n\neg.\n\n```python\nclass Book(models.Model):\n\ttitle = models.CharField(max_length=100)\n\tauthor = models.CharField(max_length=50)\n\t\n\tobjects = models.Manager() # default manager\n\tcustom_objects = CustomBOokManager() # custom manager\n```\n\n\n\n[source](http://blog.csdn.net/sicofield/article/details/49283751)\n\n\n\n","source":"_posts/Django-Manager-Method.md","raw":"---\ntitle: Django Manager Method\ndate: 2016-04-25 00:00:01\n---\n\n\n\n#### Django Manager\n\nDjango 里会为每一个 model 生成一个 Manager默认名字为 objects一般情况下对 model 进行的处理都是通过 model.objects.XXX( ) 来进行的。其实是调用了 model 的 manager 的方法,而 manager 之中的方法是 QuerySet 方法的代理QuerySet 方法是对数据库操作的封装。\n\neg.\n\n```python\nfrom django.db import models\n\nclass Person(models.Model):\n\t...\n\tpeople = models.Manager()\n```\n\n上面这个 model`Person.objects`会产生一个`AttributeError`,但是`Person.people`就可以正常操作。因为默认的 manager 已经变成 peopleobjects 这个 manager 没有重新声明,不起作用。\n\n#### 自定义 Manager\n\n通常需要自定义 manager 的情况有两点:\n\n1. 需要修改/扩展 Django 的 manager 方法\n2. 需要修改返回的 QuerySet\n\n#### 默认 Manager\n\n如果使用自定义的 manager 需要注意的是Django 将 model 中定义的第一个 manager 认为是默认 manager而且 Django 框架中会用到默认 manager。\n\n笨方法是使用自定义 manager 的时候,对于 model 依然提供 objects 这个默认 manager并放在第一个。\n\neg.\n\n```python\nclass Book(models.Model):\n\ttitle = models.CharField(max_length=100)\n\tauthor = models.CharField(max_length=50)\n\t\n\tobjects = models.Manager() # default manager\n\tcustom_objects = CustomBOokManager() # custom manager\n```\n\n\n\n[source](http://blog.csdn.net/sicofield/article/details/49283751)\n\n\n\n","slug":"Django-Manager-Method","published":1,"updated":"2018-05-15T14:58:35.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk52001bsubuwh45f7em","content":"<h4 id=\"Django_Manager\"><a href=\"#Django_Manager\" class=\"headerlink\" title=\"Django Manager\"></a>Django Manager</h4><p>Django 里会为每一个 model 生成一个 Manager默认名字为 objects一般情况下对 model 进行的处理都是通过 model.objects.XXX( ) 来进行的。其实是调用了 model 的 manager 的方法,而 manager 之中的方法是 QuerySet 方法的代理QuerySet 方法是对数据库操作的封装。</p>\n<p>eg.</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">from</span> django.db <span class=\"keyword\">import</span> models</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Person</span><span class=\"params\">(models.Model)</span>:</span></span><br><span class=\"line\">\t...</span><br><span class=\"line\">\tpeople = models.Manager()</span><br></pre></td></tr></table></figure>\n<p>上面这个 model<code>Person.objects</code>会产生一个<code>AttributeError</code>,但是<code>Person.people</code>就可以正常操作。因为默认的 manager 已经变成 peopleobjects 这个 manager 没有重新声明,不起作用。</p>\n<h4 id=\"u81EA_u5B9A_u4E49_Manager\"><a href=\"#u81EA_u5B9A_u4E49_Manager\" class=\"headerlink\" title=\"自定义 Manager\"></a>自定义 Manager</h4><p>通常需要自定义 manager 的情况有两点:</p>\n<ol>\n<li>需要修改/扩展 Django 的 manager 方法</li>\n<li>需要修改返回的 QuerySet</li>\n</ol>\n<h4 id=\"u9ED8_u8BA4_Manager\"><a href=\"#u9ED8_u8BA4_Manager\" class=\"headerlink\" title=\"默认 Manager\"></a>默认 Manager</h4><p>如果使用自定义的 manager 需要注意的是Django 将 model 中定义的第一个 manager 认为是默认 manager而且 Django 框架中会用到默认 manager。</p>\n<p>笨方法是使用自定义 manager 的时候,对于 model 依然提供 objects 这个默认 manager并放在第一个。</p>\n<p>eg.</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Book</span><span class=\"params\">(models.Model)</span>:</span></span><br><span class=\"line\">\ttitle = models.CharField(max_length=<span class=\"number\">100</span>)</span><br><span class=\"line\">\tauthor = models.CharField(max_length=<span class=\"number\">50</span>)</span><br><span class=\"line\">\t</span><br><span class=\"line\">\tobjects = models.Manager() <span class=\"comment\"># default manager</span></span><br><span class=\"line\">\tcustom_objects = CustomBOokManager() <span class=\"comment\"># custom manager</span></span><br></pre></td></tr></table></figure>\n<p><a href=\"http://blog.csdn.net/sicofield/article/details/49283751\" target=\"_blank\" rel=\"noopener\">source</a></p>\n","site":{"data":{}},"excerpt":"","more":"<h4 id=\"Django_Manager\"><a href=\"#Django_Manager\" class=\"headerlink\" title=\"Django Manager\"></a>Django Manager</h4><p>Django 里会为每一个 model 生成一个 Manager默认名字为 objects一般情况下对 model 进行的处理都是通过 model.objects.XXX( ) 来进行的。其实是调用了 model 的 manager 的方法,而 manager 之中的方法是 QuerySet 方法的代理QuerySet 方法是对数据库操作的封装。</p>\n<p>eg.</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">from</span> django.db <span class=\"keyword\">import</span> models</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Person</span><span class=\"params\">(models.Model)</span>:</span></span><br><span class=\"line\">\t...</span><br><span class=\"line\">\tpeople = models.Manager()</span><br></pre></td></tr></table></figure>\n<p>上面这个 model<code>Person.objects</code>会产生一个<code>AttributeError</code>,但是<code>Person.people</code>就可以正常操作。因为默认的 manager 已经变成 peopleobjects 这个 manager 没有重新声明,不起作用。</p>\n<h4 id=\"u81EA_u5B9A_u4E49_Manager\"><a href=\"#u81EA_u5B9A_u4E49_Manager\" class=\"headerlink\" title=\"自定义 Manager\"></a>自定义 Manager</h4><p>通常需要自定义 manager 的情况有两点:</p>\n<ol>\n<li>需要修改/扩展 Django 的 manager 方法</li>\n<li>需要修改返回的 QuerySet</li>\n</ol>\n<h4 id=\"u9ED8_u8BA4_Manager\"><a href=\"#u9ED8_u8BA4_Manager\" class=\"headerlink\" title=\"默认 Manager\"></a>默认 Manager</h4><p>如果使用自定义的 manager 需要注意的是Django 将 model 中定义的第一个 manager 认为是默认 manager而且 Django 框架中会用到默认 manager。</p>\n<p>笨方法是使用自定义 manager 的时候,对于 model 依然提供 objects 这个默认 manager并放在第一个。</p>\n<p>eg.</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Book</span><span class=\"params\">(models.Model)</span>:</span></span><br><span class=\"line\">\ttitle = models.CharField(max_length=<span class=\"number\">100</span>)</span><br><span class=\"line\">\tauthor = models.CharField(max_length=<span class=\"number\">50</span>)</span><br><span class=\"line\">\t</span><br><span class=\"line\">\tobjects = models.Manager() <span class=\"comment\"># default manager</span></span><br><span class=\"line\">\tcustom_objects = CustomBOokManager() <span class=\"comment\"># custom manager</span></span><br></pre></td></tr></table></figure>\n<p><a href=\"http://blog.csdn.net/sicofield/article/details/49283751\" target=\"_blank\" rel=\"noopener\">source</a></p>\n"},{"title":"Flask Day 1","date":"2016-02-14T17:23:33.000Z","_content":"\n### \"Hello World\" in Flask\n\nCreate a folder named `microblog` (or whatever you want). Then cd into that folder and run following prompt in terminal:\n\n``` bash\n$ python3 -m venv flask\n```\n\nNow you'll have a folder named `flask` inside `microblog`, containing a private version of Python interpreter.\n\nAnd you should install **flask** and extensions by the commands below:\n\n``` bash\n$ flask/bin/pip install flask\n$ flask/bin/pip install flask-login\n$ flask/bin/pip install flask-openid\n$ flask/bin/pip install flask-mail\n$ flask/bin/pip install flask-sqlalchemy\n$ flask/bin/pip install sqlalchemy-migrate\n$ flask/bin/pip install flask-whooshalchemy\n$ flask/bin/pip install flask-wtf\n$ flask/bin/pip install flask-babel\n$ flask/bin/pip install guess_language\n$ flask/bin/pip install flipflop\n$ flask/bin/pip install coverage\n```\n\nAfter that, let's create the basic structure for our application: `app` `app/static` `app/templates` `tmp`.\n\n1. `app` — where the application package is\n2. `static` — stores static files like images, javascripts, and css.\n3. `templates` — where templates will go.\n\nThen you can start with ``__init__.py`` which should put into app folder (file `app/__init__.py`):\n\n``` python\nfrom flask import Flask\n\napp = Flask(__name__)\nfrom app import views\n```\n\nThe views are the handlers that response to requests from web browsers or other clients. Each view function is mapped to one or more request URLs.\n\nLet's see what a views function looks like (file `app/views.py`):\n\n``` python\nfrom flask import Flask\n\napp = Flask(__name__)\nfrom app import views\n```\n\nFinally we should create a script to starts up the web server with our application(file `run.py`):\n\n``` python\n#!flask/bin/python\nfrom app import app\napp.run(debug=True)\n```\n\nTo indicating that is an executable file you need to run this in terminal:\n\n``` bash\n$ chmod a+x run.py\n```\n\nNow the file structure should look like:\n\n``` \n microblog\\\n flask\\\n <virtual environment files>\n app\\\n static\\\n templates\\\n __init__.py\n views.py\n tmp\\\n run.py\n```\n\nThen start to write the template (file `app/templates/index.html`):\n\n``` html\n<html>\n \n <head>\n <title>{{ title }} - microblog</title>\n </head>\n \n <body>\n <h1>Hello, {{ user.nickname }}!</h1>\n </body>\n \n</html>\n```\n\nNow let's write the view function that uses this template (file `app/views.py`):\n\n``` python\nfrom flask import render_template\nfrom app import app\n\n@app.route('/')\n@app.route('/index')\ndef index():\n user = {'nickname': 'ching'} # fake user\n return render_template('index.html',\n title='Home',\n user=user)\n```\n\n`render_template` function is what we import from Flask framework to render the template. It uses [Jinja2](http://jinja.pocoo.org/) templating engine.\n\n","source":"_posts/Flask-Day-1.md","raw":"---\ntitle: Flask Day 1\ndate: 2016-02-15 01:23:33\n---\n\n### \"Hello World\" in Flask\n\nCreate a folder named `microblog` (or whatever you want). Then cd into that folder and run following prompt in terminal:\n\n``` bash\n$ python3 -m venv flask\n```\n\nNow you'll have a folder named `flask` inside `microblog`, containing a private version of Python interpreter.\n\nAnd you should install **flask** and extensions by the commands below:\n\n``` bash\n$ flask/bin/pip install flask\n$ flask/bin/pip install flask-login\n$ flask/bin/pip install flask-openid\n$ flask/bin/pip install flask-mail\n$ flask/bin/pip install flask-sqlalchemy\n$ flask/bin/pip install sqlalchemy-migrate\n$ flask/bin/pip install flask-whooshalchemy\n$ flask/bin/pip install flask-wtf\n$ flask/bin/pip install flask-babel\n$ flask/bin/pip install guess_language\n$ flask/bin/pip install flipflop\n$ flask/bin/pip install coverage\n```\n\nAfter that, let's create the basic structure for our application: `app` `app/static` `app/templates` `tmp`.\n\n1. `app` — where the application package is\n2. `static` — stores static files like images, javascripts, and css.\n3. `templates` — where templates will go.\n\nThen you can start with ``__init__.py`` which should put into app folder (file `app/__init__.py`):\n\n``` python\nfrom flask import Flask\n\napp = Flask(__name__)\nfrom app import views\n```\n\nThe views are the handlers that response to requests from web browsers or other clients. Each view function is mapped to one or more request URLs.\n\nLet's see what a views function looks like (file `app/views.py`):\n\n``` python\nfrom flask import Flask\n\napp = Flask(__name__)\nfrom app import views\n```\n\nFinally we should create a script to starts up the web server with our application(file `run.py`):\n\n``` python\n#!flask/bin/python\nfrom app import app\napp.run(debug=True)\n```\n\nTo indicating that is an executable file you need to run this in terminal:\n\n``` bash\n$ chmod a+x run.py\n```\n\nNow the file structure should look like:\n\n``` \n microblog\\\n flask\\\n <virtual environment files>\n app\\\n static\\\n templates\\\n __init__.py\n views.py\n tmp\\\n run.py\n```\n\nThen start to write the template (file `app/templates/index.html`):\n\n``` html\n<html>\n \n <head>\n <title>{{ title }} - microblog</title>\n </head>\n \n <body>\n <h1>Hello, {{ user.nickname }}!</h1>\n </body>\n \n</html>\n```\n\nNow let's write the view function that uses this template (file `app/views.py`):\n\n``` python\nfrom flask import render_template\nfrom app import app\n\n@app.route('/')\n@app.route('/index')\ndef index():\n user = {'nickname': 'ching'} # fake user\n return render_template('index.html',\n title='Home',\n user=user)\n```\n\n`render_template` function is what we import from Flask framework to render the template. It uses [Jinja2](http://jinja.pocoo.org/) templating engine.\n\n","slug":"Flask-Day-1","published":1,"updated":"2018-05-15T14:58:35.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk52001dsubuwkxumfmo","content":"<h3 id=\"u201CHello_World_u201D_in_Flask\"><a href=\"#u201CHello_World_u201D_in_Flask\" class=\"headerlink\" title=\"“Hello World” in Flask\"></a>“Hello World” in Flask</h3><p>Create a folder named <code>microblog</code> (or whatever you want). Then cd into that folder and run following prompt in terminal:</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$ python3 -m venv flask</span><br></pre></td></tr></table></figure>\n<p>Now youll have a folder named <code>flask</code> inside <code>microblog</code>, containing a private version of Python interpreter.</p>\n<p>And you should install <strong>flask</strong> and extensions by the commands below:</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$ flask/bin/pip install flask</span><br><span class=\"line\">$ flask/bin/pip install flask-login</span><br><span class=\"line\">$ flask/bin/pip install flask-openid</span><br><span class=\"line\">$ flask/bin/pip install flask-mail</span><br><span class=\"line\">$ flask/bin/pip install flask-sqlalchemy</span><br><span class=\"line\">$ flask/bin/pip install sqlalchemy-migrate</span><br><span class=\"line\">$ flask/bin/pip install flask-whooshalchemy</span><br><span class=\"line\">$ flask/bin/pip install flask-wtf</span><br><span class=\"line\">$ flask/bin/pip install flask-babel</span><br><span class=\"line\">$ flask/bin/pip install guess_language</span><br><span class=\"line\">$ flask/bin/pip install flipflop</span><br><span class=\"line\">$ flask/bin/pip install coverage</span><br></pre></td></tr></table></figure>\n<p>After that, lets create the basic structure for our application: <code>app</code> <code>app/static</code> <code>app/templates</code> <code>tmp</code>.</p>\n<ol>\n<li><code>app</code> — where the application package is</li>\n<li><code>static</code> — stores static files like images, javascripts, and css.</li>\n<li><code>templates</code> — where templates will go.</li>\n</ol>\n<p>Then you can start with <code>__init__.py</code> which should put into app folder (file <code>app/__init__.py</code>):</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">from</span> flask <span class=\"keyword\">import</span> Flask</span><br><span class=\"line\"></span><br><span class=\"line\">app = Flask(__name__)</span><br><span class=\"line\"><span class=\"keyword\">from</span> app <span class=\"keyword\">import</span> views</span><br></pre></td></tr></table></figure>\n<p>The views are the handlers that response to requests from web browsers or other clients. Each view function is mapped to one or more request URLs.</p>\n<p>Lets see what a views function looks like (file <code>app/views.py</code>):</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">from</span> flask <span class=\"keyword\">import</span> Flask</span><br><span class=\"line\"></span><br><span class=\"line\">app = Flask(__name__)</span><br><span class=\"line\"><span class=\"keyword\">from</span> app <span class=\"keyword\">import</span> views</span><br></pre></td></tr></table></figure>\n<p>Finally we should create a script to starts up the web server with our application(file <code>run.py</code>):</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">#!flask/bin/python</span></span><br><span class=\"line\"><span class=\"keyword\">from</span> app <span class=\"keyword\">import</span> app</span><br><span class=\"line\">app.run(debug=<span class=\"keyword\">True</span>)</span><br></pre></td></tr></table></figure>\n<p>To indicating that is an executable file you need to run this in terminal:</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$ chmod a+x run.py</span><br></pre></td></tr></table></figure>\n<p>Now the file structure should look like:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">microblog\\</span><br><span class=\"line\"> flask\\</span><br><span class=\"line\"> &lt;virtual environment files&gt;</span><br><span class=\"line\"> app\\</span><br><span class=\"line\"> static\\</span><br><span class=\"line\"> templates\\</span><br><span class=\"line\"> __init__.py</span><br><span class=\"line\"> views.py</span><br><span class=\"line\"> tmp\\</span><br><span class=\"line\"> run.py</span><br></pre></td></tr></table></figure>\n<p>Then start to write the template (file <code>app/templates/index.html</code>):</p>\n<figure class=\"highlight html\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"tag\">&lt;<span class=\"name\">html</span>&gt;</span></span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"tag\">&lt;<span class=\"name\">head</span>&gt;</span></span><br><span class=\"line\"> <span class=\"tag\">&lt;<span class=\"name\">title</span>&gt;</span>&#123;&#123; title &#125;&#125; - microblog<span class=\"tag\">&lt;/<span class=\"name\">title</span>&gt;</span></span><br><span class=\"line\"> <span class=\"tag\">&lt;/<span class=\"name\">head</span>&gt;</span></span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"tag\">&lt;<span class=\"name\">body</span>&gt;</span></span><br><span class=\"line\"> <span class=\"tag\">&lt;<span class=\"name\">h1</span>&gt;</span>Hello, &#123;&#123; user.nickname &#125;&#125;!<span class=\"tag\">&lt;/<span class=\"name\">h1</span>&gt;</span></span><br><span class=\"line\"> <span class=\"tag\">&lt;/<span class=\"name\">body</span>&gt;</span></span><br><span class=\"line\"> </span><br><span class=\"line\"><span class=\"tag\">&lt;/<span class=\"name\">html</span>&gt;</span></span><br></pre></td></tr></table></figure>\n<p>Now lets write the view function that uses this template (file <code>app/views.py</code>):</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">from</span> flask <span class=\"keyword\">import</span> render_template</span><br><span class=\"line\"><span class=\"keyword\">from</span> app <span class=\"keyword\">import</span> app</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"meta\">@app.route('/')</span></span><br><span class=\"line\"><span class=\"meta\">@app.route('/index')</span></span><br><span class=\"line\"><span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">index</span><span class=\"params\">()</span>:</span></span><br><span class=\"line\"> user = &#123;<span class=\"string\">'nickname'</span>: <span class=\"string\">'ching'</span>&#125; <span class=\"comment\"># fake user</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> render_template(<span class=\"string\">'index.html'</span>,</span><br><span class=\"line\"> title=<span class=\"string\">'Home'</span>,</span><br><span class=\"line\"> user=user)</span><br></pre></td></tr></table></figure>\n<p><code>render_template</code> function is what we import from Flask framework to render the template. It uses <a href=\"http://jinja.pocoo.org/\" target=\"_blank\" rel=\"noopener\">Jinja2</a> templating engine.</p>\n","site":{"data":{}},"excerpt":"","more":"<h3 id=\"u201CHello_World_u201D_in_Flask\"><a href=\"#u201CHello_World_u201D_in_Flask\" class=\"headerlink\" title=\"“Hello World” in Flask\"></a>“Hello World” in Flask</h3><p>Create a folder named <code>microblog</code> (or whatever you want). Then cd into that folder and run following prompt in terminal:</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$ python3 -m venv flask</span><br></pre></td></tr></table></figure>\n<p>Now youll have a folder named <code>flask</code> inside <code>microblog</code>, containing a private version of Python interpreter.</p>\n<p>And you should install <strong>flask</strong> and extensions by the commands below:</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$ flask/bin/pip install flask</span><br><span class=\"line\">$ flask/bin/pip install flask-login</span><br><span class=\"line\">$ flask/bin/pip install flask-openid</span><br><span class=\"line\">$ flask/bin/pip install flask-mail</span><br><span class=\"line\">$ flask/bin/pip install flask-sqlalchemy</span><br><span class=\"line\">$ flask/bin/pip install sqlalchemy-migrate</span><br><span class=\"line\">$ flask/bin/pip install flask-whooshalchemy</span><br><span class=\"line\">$ flask/bin/pip install flask-wtf</span><br><span class=\"line\">$ flask/bin/pip install flask-babel</span><br><span class=\"line\">$ flask/bin/pip install guess_language</span><br><span class=\"line\">$ flask/bin/pip install flipflop</span><br><span class=\"line\">$ flask/bin/pip install coverage</span><br></pre></td></tr></table></figure>\n<p>After that, lets create the basic structure for our application: <code>app</code> <code>app/static</code> <code>app/templates</code> <code>tmp</code>.</p>\n<ol>\n<li><code>app</code> — where the application package is</li>\n<li><code>static</code> — stores static files like images, javascripts, and css.</li>\n<li><code>templates</code> — where templates will go.</li>\n</ol>\n<p>Then you can start with <code>__init__.py</code> which should put into app folder (file <code>app/__init__.py</code>):</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">from</span> flask <span class=\"keyword\">import</span> Flask</span><br><span class=\"line\"></span><br><span class=\"line\">app = Flask(__name__)</span><br><span class=\"line\"><span class=\"keyword\">from</span> app <span class=\"keyword\">import</span> views</span><br></pre></td></tr></table></figure>\n<p>The views are the handlers that response to requests from web browsers or other clients. Each view function is mapped to one or more request URLs.</p>\n<p>Lets see what a views function looks like (file <code>app/views.py</code>):</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">from</span> flask <span class=\"keyword\">import</span> Flask</span><br><span class=\"line\"></span><br><span class=\"line\">app = Flask(__name__)</span><br><span class=\"line\"><span class=\"keyword\">from</span> app <span class=\"keyword\">import</span> views</span><br></pre></td></tr></table></figure>\n<p>Finally we should create a script to starts up the web server with our application(file <code>run.py</code>):</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">#!flask/bin/python</span></span><br><span class=\"line\"><span class=\"keyword\">from</span> app <span class=\"keyword\">import</span> app</span><br><span class=\"line\">app.run(debug=<span class=\"keyword\">True</span>)</span><br></pre></td></tr></table></figure>\n<p>To indicating that is an executable file you need to run this in terminal:</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$ chmod a+x run.py</span><br></pre></td></tr></table></figure>\n<p>Now the file structure should look like:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">microblog\\</span><br><span class=\"line\"> flask\\</span><br><span class=\"line\"> &lt;virtual environment files&gt;</span><br><span class=\"line\"> app\\</span><br><span class=\"line\"> static\\</span><br><span class=\"line\"> templates\\</span><br><span class=\"line\"> __init__.py</span><br><span class=\"line\"> views.py</span><br><span class=\"line\"> tmp\\</span><br><span class=\"line\"> run.py</span><br></pre></td></tr></table></figure>\n<p>Then start to write the template (file <code>app/templates/index.html</code>):</p>\n<figure class=\"highlight html\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"tag\">&lt;<span class=\"name\">html</span>&gt;</span></span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"tag\">&lt;<span class=\"name\">head</span>&gt;</span></span><br><span class=\"line\"> <span class=\"tag\">&lt;<span class=\"name\">title</span>&gt;</span>&#123;&#123; title &#125;&#125; - microblog<span class=\"tag\">&lt;/<span class=\"name\">title</span>&gt;</span></span><br><span class=\"line\"> <span class=\"tag\">&lt;/<span class=\"name\">head</span>&gt;</span></span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"tag\">&lt;<span class=\"name\">body</span>&gt;</span></span><br><span class=\"line\"> <span class=\"tag\">&lt;<span class=\"name\">h1</span>&gt;</span>Hello, &#123;&#123; user.nickname &#125;&#125;!<span class=\"tag\">&lt;/<span class=\"name\">h1</span>&gt;</span></span><br><span class=\"line\"> <span class=\"tag\">&lt;/<span class=\"name\">body</span>&gt;</span></span><br><span class=\"line\"> </span><br><span class=\"line\"><span class=\"tag\">&lt;/<span class=\"name\">html</span>&gt;</span></span><br></pre></td></tr></table></figure>\n<p>Now lets write the view function that uses this template (file <code>app/views.py</code>):</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">from</span> flask <span class=\"keyword\">import</span> render_template</span><br><span class=\"line\"><span class=\"keyword\">from</span> app <span class=\"keyword\">import</span> app</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"meta\">@app.route('/')</span></span><br><span class=\"line\"><span class=\"meta\">@app.route('/index')</span></span><br><span class=\"line\"><span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">index</span><span class=\"params\">()</span>:</span></span><br><span class=\"line\"> user = &#123;<span class=\"string\">'nickname'</span>: <span class=\"string\">'ching'</span>&#125; <span class=\"comment\"># fake user</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> render_template(<span class=\"string\">'index.html'</span>,</span><br><span class=\"line\"> title=<span class=\"string\">'Home'</span>,</span><br><span class=\"line\"> user=user)</span><br></pre></td></tr></table></figure>\n<p><code>render_template</code> function is what we import from Flask framework to render the template. It uses <a href=\"http://jinja.pocoo.org/\" target=\"_blank\" rel=\"noopener\">Jinja2</a> templating engine.</p>\n"},{"title":"Flask Day 2","date":"2016-02-16T14:45:06.000Z","_content":"\nTo handle web forms we use [Flask-WTF\t](http://packages.python.org/Flask-WTF). So we need to write a config file (file `config.py`):\n\n``` python\nWTF_CSRF_ENABLED = True\nSECRET_KEY = 'you-will-never-guess'\n```\n\nAnd then you need to use this config (file `app/__init__.py`):\n\n``` python\nfrom flask import Flask\n\napp = Flask(__name__)\napp.config.from_object('config')\n\nfrom app import views\n```\n\nLet's build a simple form (file `app/forms.app`):\n\n``` python\nfrom flask.ext.wtf import Form\nfrom wtforms import StringField, BooleanField\nfrom wtforms.validators import DataRequired\n\nclass LoginForm(Form):\n openid = StringField('openid', validators=[DataRequired()])\n remember_me = BooleanField('remember_me', default=False)\n```\n\nThe `DataRequired()` is a validator that checks the field is empty or not.\n\nAfter that, we need a HTML page to show the form (file `app/templates/login.html`):\n\n``` html\n<!-- extend from base layout -->\n{% extends \"base.html\" %}\n\n{% block content %}\n <h1>Sign In</h1>\n <form action=\"\" method=\"post\" name=\"login\">\n {{ form.hidden_tag() }}\n <p>\n Please enter your OpenID:<br>\n {{ form.openid(size=80) }}<br>\n </p>\n <p>{{ form.remember_me }} Remember Me</p>\n <p><input type=\"submit\" value=\"Sign In\"></p>\n </form>\n{% endblock %}\n```\n\n\n\nThe final step is to code a view function that renders the template and receiving data from form (file `app/views.py`):\n\n``` python\nfrom flask import render_template, flash, redirect\nfrom app import app\nfrom .forms import LoginForm\n\n# index view function suppressed for brevity\n\napp.route('/login', methods=['GET', 'POST'])\ndef login():\n form = LoginForm()\n if form.validate_on_submit():\n flash('Login requested for OpenID=\"%s\", remember_me=%s' %\n (form.openid.data, str(form.remember_me.data)))\n return redirect('/index')\n return render_template('login.html', \n title='Sign In',\n form=form)\n```\n\n","source":"_posts/Flask-Day-2.md","raw":"---\ntitle: Flask Day 2\ndate: 2016-02-16 22:45:06\n---\n\nTo handle web forms we use [Flask-WTF\t](http://packages.python.org/Flask-WTF). So we need to write a config file (file `config.py`):\n\n``` python\nWTF_CSRF_ENABLED = True\nSECRET_KEY = 'you-will-never-guess'\n```\n\nAnd then you need to use this config (file `app/__init__.py`):\n\n``` python\nfrom flask import Flask\n\napp = Flask(__name__)\napp.config.from_object('config')\n\nfrom app import views\n```\n\nLet's build a simple form (file `app/forms.app`):\n\n``` python\nfrom flask.ext.wtf import Form\nfrom wtforms import StringField, BooleanField\nfrom wtforms.validators import DataRequired\n\nclass LoginForm(Form):\n openid = StringField('openid', validators=[DataRequired()])\n remember_me = BooleanField('remember_me', default=False)\n```\n\nThe `DataRequired()` is a validator that checks the field is empty or not.\n\nAfter that, we need a HTML page to show the form (file `app/templates/login.html`):\n\n``` html\n<!-- extend from base layout -->\n{% extends \"base.html\" %}\n\n{% block content %}\n <h1>Sign In</h1>\n <form action=\"\" method=\"post\" name=\"login\">\n {{ form.hidden_tag() }}\n <p>\n Please enter your OpenID:<br>\n {{ form.openid(size=80) }}<br>\n </p>\n <p>{{ form.remember_me }} Remember Me</p>\n <p><input type=\"submit\" value=\"Sign In\"></p>\n </form>\n{% endblock %}\n```\n\n\n\nThe final step is to code a view function that renders the template and receiving data from form (file `app/views.py`):\n\n``` python\nfrom flask import render_template, flash, redirect\nfrom app import app\nfrom .forms import LoginForm\n\n# index view function suppressed for brevity\n\napp.route('/login', methods=['GET', 'POST'])\ndef login():\n form = LoginForm()\n if form.validate_on_submit():\n flash('Login requested for OpenID=\"%s\", remember_me=%s' %\n (form.openid.data, str(form.remember_me.data)))\n return redirect('/index')\n return render_template('login.html', \n title='Sign In',\n form=form)\n```\n\n","slug":"Flask-Day-2","published":1,"updated":"2018-05-15T14:58:35.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk53001fsubukfg8z46w","content":"<p>To handle web forms we use <a href=\"http://packages.python.org/Flask-WTF\" target=\"_blank\" rel=\"noopener\">Flask-WTF </a>. So we need to write a config file (file <code>config.py</code>):</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">WTF_CSRF_ENABLED = <span class=\"keyword\">True</span></span><br><span class=\"line\">SECRET_KEY = <span class=\"string\">'you-will-never-guess'</span></span><br></pre></td></tr></table></figure>\n<p>And then you need to use this config (file <code>app/__init__.py</code>):</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">from</span> flask <span class=\"keyword\">import</span> Flask</span><br><span class=\"line\"></span><br><span class=\"line\">app = Flask(__name__)</span><br><span class=\"line\">app.config.from_object(<span class=\"string\">'config'</span>)</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"keyword\">from</span> app <span class=\"keyword\">import</span> views</span><br></pre></td></tr></table></figure>\n<p>Lets build a simple form (file <code>app/forms.app</code>):</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">from</span> flask.ext.wtf <span class=\"keyword\">import</span> Form</span><br><span class=\"line\"><span class=\"keyword\">from</span> wtforms <span class=\"keyword\">import</span> StringField, BooleanField</span><br><span class=\"line\"><span class=\"keyword\">from</span> wtforms.validators <span class=\"keyword\">import</span> DataRequired</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">LoginForm</span><span class=\"params\">(Form)</span>:</span></span><br><span class=\"line\"> openid = StringField(<span class=\"string\">'openid'</span>, validators=[DataRequired()])</span><br><span class=\"line\"> remember_me = BooleanField(<span class=\"string\">'remember_me'</span>, default=<span class=\"keyword\">False</span>)</span><br></pre></td></tr></table></figure>\n<p>The <code>DataRequired()</code> is a validator that checks the field is empty or not.</p>\n<p>After that, we need a HTML page to show the form (file <code>app/templates/login.html</code>):</p>\n<figure class=\"highlight html\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">&lt;!-- extend from base layout --&gt;</span></span><br><span class=\"line\">&#123;% extends \"base.html\" %&#125;</span><br><span class=\"line\"></span><br><span class=\"line\">&#123;% block content %&#125;</span><br><span class=\"line\"> <span class=\"tag\">&lt;<span class=\"name\">h1</span>&gt;</span>Sign In<span class=\"tag\">&lt;/<span class=\"name\">h1</span>&gt;</span></span><br><span class=\"line\"> <span class=\"tag\">&lt;<span class=\"name\">form</span> <span class=\"attr\">action</span>=<span class=\"string\">\"\"</span> <span class=\"attr\">method</span>=<span class=\"string\">\"post\"</span> <span class=\"attr\">name</span>=<span class=\"string\">\"login\"</span>&gt;</span></span><br><span class=\"line\"> &#123;&#123; form.hidden_tag() &#125;&#125;</span><br><span class=\"line\"> <span class=\"tag\">&lt;<span class=\"name\">p</span>&gt;</span></span><br><span class=\"line\"> Please enter your OpenID:<span class=\"tag\">&lt;<span class=\"name\">br</span>&gt;</span></span><br><span class=\"line\"> &#123;&#123; form.openid(size=80) &#125;&#125;<span class=\"tag\">&lt;<span class=\"name\">br</span>&gt;</span></span><br><span class=\"line\"> <span class=\"tag\">&lt;/<span class=\"name\">p</span>&gt;</span></span><br><span class=\"line\"> <span class=\"tag\">&lt;<span class=\"name\">p</span>&gt;</span>&#123;&#123; form.remember_me &#125;&#125; Remember Me<span class=\"tag\">&lt;/<span class=\"name\">p</span>&gt;</span></span><br><span class=\"line\"> <span class=\"tag\">&lt;<span class=\"name\">p</span>&gt;</span><span class=\"tag\">&lt;<span class=\"name\">input</span> <span class=\"attr\">type</span>=<span class=\"string\">\"submit\"</span> <span class=\"attr\">value</span>=<span class=\"string\">\"Sign In\"</span>&gt;</span><span class=\"tag\">&lt;/<span class=\"name\">p</span>&gt;</span></span><br><span class=\"line\"> <span class=\"tag\">&lt;/<span class=\"name\">form</span>&gt;</span></span><br><span class=\"line\">&#123;% endblock %&#125;</span><br></pre></td></tr></table></figure>\n<p>The final step is to code a view function that renders the template and receiving data from form (file <code>app/views.py</code>):</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">from</span> flask <span class=\"keyword\">import</span> render_template, flash, redirect</span><br><span class=\"line\"><span class=\"keyword\">from</span> app <span class=\"keyword\">import</span> app</span><br><span class=\"line\"><span class=\"keyword\">from</span> .forms <span class=\"keyword\">import</span> LoginForm</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\"># index view function suppressed for brevity</span></span><br><span class=\"line\"></span><br><span class=\"line\">app.route(<span class=\"string\">'/login'</span>, methods=[<span class=\"string\">'GET'</span>, <span class=\"string\">'POST'</span>])</span><br><span class=\"line\"><span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">login</span><span class=\"params\">()</span>:</span></span><br><span class=\"line\"> form = LoginForm()</span><br><span class=\"line\"> <span class=\"keyword\">if</span> form.validate_on_submit():</span><br><span class=\"line\"> flash(<span class=\"string\">'Login requested for OpenID=\"%s\", remember_me=%s'</span> %</span><br><span class=\"line\"> (form.openid.data, str(form.remember_me.data)))</span><br><span class=\"line\"> <span class=\"keyword\">return</span> redirect(<span class=\"string\">'/index'</span>)</span><br><span class=\"line\"> <span class=\"keyword\">return</span> render_template(<span class=\"string\">'login.html'</span>, </span><br><span class=\"line\"> title=<span class=\"string\">'Sign In'</span>,</span><br><span class=\"line\"> form=form)</span><br></pre></td></tr></table></figure>\n","site":{"data":{}},"excerpt":"","more":"<p>To handle web forms we use <a href=\"http://packages.python.org/Flask-WTF\" target=\"_blank\" rel=\"noopener\">Flask-WTF </a>. So we need to write a config file (file <code>config.py</code>):</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">WTF_CSRF_ENABLED = <span class=\"keyword\">True</span></span><br><span class=\"line\">SECRET_KEY = <span class=\"string\">'you-will-never-guess'</span></span><br></pre></td></tr></table></figure>\n<p>And then you need to use this config (file <code>app/__init__.py</code>):</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">from</span> flask <span class=\"keyword\">import</span> Flask</span><br><span class=\"line\"></span><br><span class=\"line\">app = Flask(__name__)</span><br><span class=\"line\">app.config.from_object(<span class=\"string\">'config'</span>)</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"keyword\">from</span> app <span class=\"keyword\">import</span> views</span><br></pre></td></tr></table></figure>\n<p>Lets build a simple form (file <code>app/forms.app</code>):</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">from</span> flask.ext.wtf <span class=\"keyword\">import</span> Form</span><br><span class=\"line\"><span class=\"keyword\">from</span> wtforms <span class=\"keyword\">import</span> StringField, BooleanField</span><br><span class=\"line\"><span class=\"keyword\">from</span> wtforms.validators <span class=\"keyword\">import</span> DataRequired</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">LoginForm</span><span class=\"params\">(Form)</span>:</span></span><br><span class=\"line\"> openid = StringField(<span class=\"string\">'openid'</span>, validators=[DataRequired()])</span><br><span class=\"line\"> remember_me = BooleanField(<span class=\"string\">'remember_me'</span>, default=<span class=\"keyword\">False</span>)</span><br></pre></td></tr></table></figure>\n<p>The <code>DataRequired()</code> is a validator that checks the field is empty or not.</p>\n<p>After that, we need a HTML page to show the form (file <code>app/templates/login.html</code>):</p>\n<figure class=\"highlight html\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">&lt;!-- extend from base layout --&gt;</span></span><br><span class=\"line\">&#123;% extends \"base.html\" %&#125;</span><br><span class=\"line\"></span><br><span class=\"line\">&#123;% block content %&#125;</span><br><span class=\"line\"> <span class=\"tag\">&lt;<span class=\"name\">h1</span>&gt;</span>Sign In<span class=\"tag\">&lt;/<span class=\"name\">h1</span>&gt;</span></span><br><span class=\"line\"> <span class=\"tag\">&lt;<span class=\"name\">form</span> <span class=\"attr\">action</span>=<span class=\"string\">\"\"</span> <span class=\"attr\">method</span>=<span class=\"string\">\"post\"</span> <span class=\"attr\">name</span>=<span class=\"string\">\"login\"</span>&gt;</span></span><br><span class=\"line\"> &#123;&#123; form.hidden_tag() &#125;&#125;</span><br><span class=\"line\"> <span class=\"tag\">&lt;<span class=\"name\">p</span>&gt;</span></span><br><span class=\"line\"> Please enter your OpenID:<span class=\"tag\">&lt;<span class=\"name\">br</span>&gt;</span></span><br><span class=\"line\"> &#123;&#123; form.openid(size=80) &#125;&#125;<span class=\"tag\">&lt;<span class=\"name\">br</span>&gt;</span></span><br><span class=\"line\"> <span class=\"tag\">&lt;/<span class=\"name\">p</span>&gt;</span></span><br><span class=\"line\"> <span class=\"tag\">&lt;<span class=\"name\">p</span>&gt;</span>&#123;&#123; form.remember_me &#125;&#125; Remember Me<span class=\"tag\">&lt;/<span class=\"name\">p</span>&gt;</span></span><br><span class=\"line\"> <span class=\"tag\">&lt;<span class=\"name\">p</span>&gt;</span><span class=\"tag\">&lt;<span class=\"name\">input</span> <span class=\"attr\">type</span>=<span class=\"string\">\"submit\"</span> <span class=\"attr\">value</span>=<span class=\"string\">\"Sign In\"</span>&gt;</span><span class=\"tag\">&lt;/<span class=\"name\">p</span>&gt;</span></span><br><span class=\"line\"> <span class=\"tag\">&lt;/<span class=\"name\">form</span>&gt;</span></span><br><span class=\"line\">&#123;% endblock %&#125;</span><br></pre></td></tr></table></figure>\n<p>The final step is to code a view function that renders the template and receiving data from form (file <code>app/views.py</code>):</p>\n<figure class=\"highlight python\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">from</span> flask <span class=\"keyword\">import</span> render_template, flash, redirect</span><br><span class=\"line\"><span class=\"keyword\">from</span> app <span class=\"keyword\">import</span> app</span><br><span class=\"line\"><span class=\"keyword\">from</span> .forms <span class=\"keyword\">import</span> LoginForm</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\"># index view function suppressed for brevity</span></span><br><span class=\"line\"></span><br><span class=\"line\">app.route(<span class=\"string\">'/login'</span>, methods=[<span class=\"string\">'GET'</span>, <span class=\"string\">'POST'</span>])</span><br><span class=\"line\"><span class=\"function\"><span class=\"keyword\">def</span> <span class=\"title\">login</span><span class=\"params\">()</span>:</span></span><br><span class=\"line\"> form = LoginForm()</span><br><span class=\"line\"> <span class=\"keyword\">if</span> form.validate_on_submit():</span><br><span class=\"line\"> flash(<span class=\"string\">'Login requested for OpenID=\"%s\", remember_me=%s'</span> %</span><br><span class=\"line\"> (form.openid.data, str(form.remember_me.data)))</span><br><span class=\"line\"> <span class=\"keyword\">return</span> redirect(<span class=\"string\">'/index'</span>)</span><br><span class=\"line\"> <span class=\"keyword\">return</span> render_template(<span class=\"string\">'login.html'</span>, </span><br><span class=\"line\"> title=<span class=\"string\">'Sign In'</span>,</span><br><span class=\"line\"> form=form)</span><br></pre></td></tr></table></figure>\n"},{"title":"Tastypie","date":"2016-05-04T04:02:00.000Z","_content":"\n#### Resources in Tastypie\n\nResources are the heart of Tastypie. By defining a resource we can actually convert a model into an API stream. The data is automatically converted into API response.\n\n\n\nUnderstanding the process of creating a resource.\n\n1. Import ModelResource from Tastypie.\n2. Import models from services app\n3. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource. \n\nAdd API URL in the urls.py of app.\n\n\n\n#### Dehydrating the JSON data\n\n![flow](https://impythonist.files.wordpress.com/2016/04/tastypie_ill.png?w=800)\n\n\n\nDehydration in Tastypie means making alterations before sending data to the client. Suppose we need to send capitalized product names instead of small letters. Now we see two kinds of dehydrate methods.\n\n##### Dehydrate_field method\n\nThis `dehydrate_field` is uesd to modify field on the response JSON. \n\n##### Dehydrate method\n\nDehydrate method is useful for aadding additional fields to bundle (response data). \n\nSimilarly using `hydrate` method we can alter the bundle data which is generated from request at the time of PUT or POST methods.","source":"_posts/Tastypie.md","raw":"---\ntitle: Tastypie\ndate: 2016-05-04 12:02:00\n---\n\n#### Resources in Tastypie\n\nResources are the heart of Tastypie. By defining a resource we can actually convert a model into an API stream. The data is automatically converted into API response.\n\n\n\nUnderstanding the process of creating a resource.\n\n1. Import ModelResource from Tastypie.\n2. Import models from services app\n3. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource. \n\nAdd API URL in the urls.py of app.\n\n\n\n#### Dehydrating the JSON data\n\n![flow](https://impythonist.files.wordpress.com/2016/04/tastypie_ill.png?w=800)\n\n\n\nDehydration in Tastypie means making alterations before sending data to the client. Suppose we need to send capitalized product names instead of small letters. Now we see two kinds of dehydrate methods.\n\n##### Dehydrate_field method\n\nThis `dehydrate_field` is uesd to modify field on the response JSON. \n\n##### Dehydrate method\n\nDehydrate method is useful for aadding additional fields to bundle (response data). \n\nSimilarly using `hydrate` method we can alter the bundle data which is generated from request at the time of PUT or POST methods.","slug":"Tastypie","published":1,"updated":"2018-05-15T14:58:35.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk54001hsubuesca2vhc","content":"<h4 id=\"Resources_in_Tastypie\"><a href=\"#Resources_in_Tastypie\" class=\"headerlink\" title=\"Resources in Tastypie\"></a>Resources in Tastypie</h4><p>Resources are the heart of Tastypie. By defining a resource we can actually convert a model into an API stream. The data is automatically converted into API response.</p>\n<p>Understanding the process of creating a resource.</p>\n<ol>\n<li>Import ModelResource from Tastypie.</li>\n<li>Import models from services app</li>\n<li>Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource. </li>\n</ol>\n<p>Add API URL in the urls.py of app.</p>\n<h4 id=\"Dehydrating_the_JSON_data\"><a href=\"#Dehydrating_the_JSON_data\" class=\"headerlink\" title=\"Dehydrating the JSON data\"></a>Dehydrating the JSON data</h4><p><img src=\"https://impythonist.files.wordpress.com/2016/04/tastypie_ill.png?w=800\" alt=\"flow\"></p>\n<p>Dehydration in Tastypie means making alterations before sending data to the client. Suppose we need to send capitalized product names instead of small letters. Now we see two kinds of dehydrate methods.</p>\n<h5 id=\"Dehydrate_field_method\"><a href=\"#Dehydrate_field_method\" class=\"headerlink\" title=\"Dehydrate_field method\"></a>Dehydrate_field method</h5><p>This <code>dehydrate_field</code> is uesd to modify field on the response JSON. </p>\n<h5 id=\"Dehydrate_method\"><a href=\"#Dehydrate_method\" class=\"headerlink\" title=\"Dehydrate method\"></a>Dehydrate method</h5><p>Dehydrate method is useful for aadding additional fields to bundle (response data). </p>\n<p>Similarly using <code>hydrate</code> method we can alter the bundle data which is generated from request at the time of PUT or POST methods.</p>\n","site":{"data":{}},"excerpt":"","more":"<h4 id=\"Resources_in_Tastypie\"><a href=\"#Resources_in_Tastypie\" class=\"headerlink\" title=\"Resources in Tastypie\"></a>Resources in Tastypie</h4><p>Resources are the heart of Tastypie. By defining a resource we can actually convert a model into an API stream. The data is automatically converted into API response.</p>\n<p>Understanding the process of creating a resource.</p>\n<ol>\n<li>Import ModelResource from Tastypie.</li>\n<li>Import models from services app</li>\n<li>Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource. </li>\n</ol>\n<p>Add API URL in the urls.py of app.</p>\n<h4 id=\"Dehydrating_the_JSON_data\"><a href=\"#Dehydrating_the_JSON_data\" class=\"headerlink\" title=\"Dehydrating the JSON data\"></a>Dehydrating the JSON data</h4><p><img src=\"https://impythonist.files.wordpress.com/2016/04/tastypie_ill.png?w=800\" alt=\"flow\"></p>\n<p>Dehydration in Tastypie means making alterations before sending data to the client. Suppose we need to send capitalized product names instead of small letters. Now we see two kinds of dehydrate methods.</p>\n<h5 id=\"Dehydrate_field_method\"><a href=\"#Dehydrate_field_method\" class=\"headerlink\" title=\"Dehydrate_field method\"></a>Dehydrate_field method</h5><p>This <code>dehydrate_field</code> is uesd to modify field on the response JSON. </p>\n<h5 id=\"Dehydrate_method\"><a href=\"#Dehydrate_method\" class=\"headerlink\" title=\"Dehydrate method\"></a>Dehydrate method</h5><p>Dehydrate method is useful for aadding additional fields to bundle (response data). </p>\n<p>Similarly using <code>hydrate</code> method we can alter the bundle data which is generated from request at the time of PUT or POST methods.</p>\n"},{"title":"First Post","date":"2016-02-12T10:00:00.000Z","_content":"\nThis is the very first post I wrote,\n\nwith [Typora](https://www.typora.io/) & [Hexo](https://hexo.io/).\n\n","source":"_posts/first-post.md","raw":"---\ntitle: First Post\ndate: 2016-02-12 18:00:00\n---\n\nThis is the very first post I wrote,\n\nwith [Typora](https://www.typora.io/) & [Hexo](https://hexo.io/).\n\n","slug":"first-post","published":1,"updated":"2018-05-15T14:58:35.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk55001isubut7gdk8uj","content":"<p>This is the very first post I wrote,</p>\n<p>with <a href=\"https://www.typora.io/\" target=\"_blank\" rel=\"noopener\">Typora</a> &amp; <a href=\"https://hexo.io/\" target=\"_blank\" rel=\"noopener\">Hexo</a>.</p>\n","site":{"data":{}},"excerpt":"","more":"<p>This is the very first post I wrote,</p>\n<p>with <a href=\"https://www.typora.io/\" target=\"_blank\" rel=\"noopener\">Typora</a> &amp; <a href=\"https://hexo.io/\" target=\"_blank\" rel=\"noopener\">Hexo</a>.</p>\n"},{"title":"TastyPie Note 1","date":"2016-05-10T09:00:00.000Z","_content":"\n### Flow Through The Request/Response Cycle\n\nTastypie can be thought of as a set of class-based view that provide the API functionality. All routing/middleware/response-handling aspectss are the same as a typical Django app. Where the differs is in the view itself.\n\nWalking through what a GET request to a list endpoint looks like:\n\n- The `Resource.urls` are checked by Django's url resolvers.\n\n- On a match for the list view, `Resource.wrap_view('dispatch_list')` is called. `wrap_view` provides basic error handling & allows for returning serilized errors.\n\n- Because dispatch_list was passed to `wrap_view`, `Resource.dispatch_list` is called next. This is a thin wrapper around `Resource.dispatch`.\n\n- `dispatch` does a bunch of havy lifting. It ensures:\n\n - the requested HTTP method is in `allowed_methos` (`method_check`).\n - the class has a method that can handle the request(`get_list`)\n - the user is authenticated(`is_authenticated`)\n - the user has no exceeded their throttle(`throttle_check`).\n\n At this point, `dispatch` actually calls the requested method (`get_list`).\n\n- `get_list` does the actual work of API. It does:\n\n - A fetch of the available objects via `Resource.obj_get_list`. In the case of `ModelResource`, this builds the ORM filters to apply (`ModelResource.build_filters`). It then gets the `QuerySet` via `ModelResource.get_object_list` (which performs `Resource.authorized_read_list` to possibly limit the set the user can work with) and applies the built filters to it.\n - It then sorts the objects based on user input (`ModelResource.apply_sorting`).\n - Then it paginates the results using the supplied `Paginator` & pulls out the data to be serialized.\n - The objects in the page have `full_dehydrate` applied to each of them, causing Tastypie to traslate the raw object data into the fields the endpoint supports.\n - Finally, it calls `Resource.create_response`.\n\n- `create_response` is a shortcut method that:\n\n - Determines the desired response format (`Resource.determine_format`).\n - Serializes the data given to it in the proper format.\n - Returns a Django `HttpResponse` (200 OK) with the serialized data.\n\n- We bubble back up the call stack to `dispatch`. The last thing `dispatch` does is potentially store that a request occured for future throttling (`Resource.log_throttled_access`) then either returns the `HttpResponse` or wraps whatever data came back in a response (so Django doesn't freak out).\n\n\n\n","source":"_posts/TastyPie-Note-1.md","raw":"---\ntitle: TastyPie Note 1\ndate: 2016-05-10 17:00:00\n---\n\n### Flow Through The Request/Response Cycle\n\nTastypie can be thought of as a set of class-based view that provide the API functionality. All routing/middleware/response-handling aspectss are the same as a typical Django app. Where the differs is in the view itself.\n\nWalking through what a GET request to a list endpoint looks like:\n\n- The `Resource.urls` are checked by Django's url resolvers.\n\n- On a match for the list view, `Resource.wrap_view('dispatch_list')` is called. `wrap_view` provides basic error handling & allows for returning serilized errors.\n\n- Because dispatch_list was passed to `wrap_view`, `Resource.dispatch_list` is called next. This is a thin wrapper around `Resource.dispatch`.\n\n- `dispatch` does a bunch of havy lifting. It ensures:\n\n - the requested HTTP method is in `allowed_methos` (`method_check`).\n - the class has a method that can handle the request(`get_list`)\n - the user is authenticated(`is_authenticated`)\n - the user has no exceeded their throttle(`throttle_check`).\n\n At this point, `dispatch` actually calls the requested method (`get_list`).\n\n- `get_list` does the actual work of API. It does:\n\n - A fetch of the available objects via `Resource.obj_get_list`. In the case of `ModelResource`, this builds the ORM filters to apply (`ModelResource.build_filters`). It then gets the `QuerySet` via `ModelResource.get_object_list` (which performs `Resource.authorized_read_list` to possibly limit the set the user can work with) and applies the built filters to it.\n - It then sorts the objects based on user input (`ModelResource.apply_sorting`).\n - Then it paginates the results using the supplied `Paginator` & pulls out the data to be serialized.\n - The objects in the page have `full_dehydrate` applied to each of them, causing Tastypie to traslate the raw object data into the fields the endpoint supports.\n - Finally, it calls `Resource.create_response`.\n\n- `create_response` is a shortcut method that:\n\n - Determines the desired response format (`Resource.determine_format`).\n - Serializes the data given to it in the proper format.\n - Returns a Django `HttpResponse` (200 OK) with the serialized data.\n\n- We bubble back up the call stack to `dispatch`. The last thing `dispatch` does is potentially store that a request occured for future throttling (`Resource.log_throttled_access`) then either returns the `HttpResponse` or wraps whatever data came back in a response (so Django doesn't freak out).\n\n\n\n","slug":"TastyPie-Note-1","published":1,"updated":"2018-05-15T14:58:35.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk55001jsubuwea2oyll","content":"<h3 id=\"Flow_Through_The_Request/Response_Cycle\"><a href=\"#Flow_Through_The_Request/Response_Cycle\" class=\"headerlink\" title=\"Flow Through The Request/Response Cycle\"></a>Flow Through The Request/Response Cycle</h3><p>Tastypie can be thought of as a set of class-based view that provide the API functionality. All routing/middleware/response-handling aspectss are the same as a typical Django app. Where the differs is in the view itself.</p>\n<p>Walking through what a GET request to a list endpoint looks like:</p>\n<ul>\n<li><p>The <code>Resource.urls</code> are checked by Djangos url resolvers.</p>\n</li>\n<li><p>On a match for the list view, <code>Resource.wrap_view(&#39;dispatch_list&#39;)</code> is called. <code>wrap_view</code> provides basic error handling &amp; allows for returning serilized errors.</p>\n</li>\n<li><p>Because dispatch_list was passed to <code>wrap_view</code>, <code>Resource.dispatch_list</code> is called next. This is a thin wrapper around <code>Resource.dispatch</code>.</p>\n</li>\n<li><p><code>dispatch</code> does a bunch of havy lifting. It ensures:</p>\n<ul>\n<li>the requested HTTP method is in <code>allowed_methos</code> (<code>method_check</code>).</li>\n<li>the class has a method that can handle the request(<code>get_list</code>)</li>\n<li>the user is authenticated(<code>is_authenticated</code>)</li>\n<li>the user has no exceeded their throttle(<code>throttle_check</code>).</li>\n</ul>\n<p>At this point, <code>dispatch</code> actually calls the requested method (<code>get_list</code>).</p>\n</li>\n<li><p><code>get_list</code> does the actual work of API. It does:</p>\n<ul>\n<li>A fetch of the available objects via <code>Resource.obj_get_list</code>. In the case of <code>ModelResource</code>, this builds the ORM filters to apply (<code>ModelResource.build_filters</code>). It then gets the <code>QuerySet</code> via <code>ModelResource.get_object_list</code> (which performs <code>Resource.authorized_read_list</code> to possibly limit the set the user can work with) and applies the built filters to it.</li>\n<li>It then sorts the objects based on user input (<code>ModelResource.apply_sorting</code>).</li>\n<li>Then it paginates the results using the supplied <code>Paginator</code> &amp; pulls out the data to be serialized.</li>\n<li>The objects in the page have <code>full_dehydrate</code> applied to each of them, causing Tastypie to traslate the raw object data into the fields the endpoint supports.</li>\n<li>Finally, it calls <code>Resource.create_response</code>.</li>\n</ul>\n</li>\n<li><p><code>create_response</code> is a shortcut method that:</p>\n<ul>\n<li>Determines the desired response format (<code>Resource.determine_format</code>).</li>\n<li>Serializes the data given to it in the proper format.</li>\n<li>Returns a Django <code>HttpResponse</code> (200 OK) with the serialized data.</li>\n</ul>\n</li>\n<li><p>We bubble back up the call stack to <code>dispatch</code>. The last thing <code>dispatch</code> does is potentially store that a request occured for future throttling (<code>Resource.log_throttled_access</code>) then either returns the <code>HttpResponse</code> or wraps whatever data came back in a response (so Django doesnt freak out).</p>\n</li>\n</ul>\n","site":{"data":{}},"excerpt":"","more":"<h3 id=\"Flow_Through_The_Request/Response_Cycle\"><a href=\"#Flow_Through_The_Request/Response_Cycle\" class=\"headerlink\" title=\"Flow Through The Request/Response Cycle\"></a>Flow Through The Request/Response Cycle</h3><p>Tastypie can be thought of as a set of class-based view that provide the API functionality. All routing/middleware/response-handling aspectss are the same as a typical Django app. Where the differs is in the view itself.</p>\n<p>Walking through what a GET request to a list endpoint looks like:</p>\n<ul>\n<li><p>The <code>Resource.urls</code> are checked by Djangos url resolvers.</p>\n</li>\n<li><p>On a match for the list view, <code>Resource.wrap_view(&#39;dispatch_list&#39;)</code> is called. <code>wrap_view</code> provides basic error handling &amp; allows for returning serilized errors.</p>\n</li>\n<li><p>Because dispatch_list was passed to <code>wrap_view</code>, <code>Resource.dispatch_list</code> is called next. This is a thin wrapper around <code>Resource.dispatch</code>.</p>\n</li>\n<li><p><code>dispatch</code> does a bunch of havy lifting. It ensures:</p>\n<ul>\n<li>the requested HTTP method is in <code>allowed_methos</code> (<code>method_check</code>).</li>\n<li>the class has a method that can handle the request(<code>get_list</code>)</li>\n<li>the user is authenticated(<code>is_authenticated</code>)</li>\n<li>the user has no exceeded their throttle(<code>throttle_check</code>).</li>\n</ul>\n<p>At this point, <code>dispatch</code> actually calls the requested method (<code>get_list</code>).</p>\n</li>\n<li><p><code>get_list</code> does the actual work of API. It does:</p>\n<ul>\n<li>A fetch of the available objects via <code>Resource.obj_get_list</code>. In the case of <code>ModelResource</code>, this builds the ORM filters to apply (<code>ModelResource.build_filters</code>). It then gets the <code>QuerySet</code> via <code>ModelResource.get_object_list</code> (which performs <code>Resource.authorized_read_list</code> to possibly limit the set the user can work with) and applies the built filters to it.</li>\n<li>It then sorts the objects based on user input (<code>ModelResource.apply_sorting</code>).</li>\n<li>Then it paginates the results using the supplied <code>Paginator</code> &amp; pulls out the data to be serialized.</li>\n<li>The objects in the page have <code>full_dehydrate</code> applied to each of them, causing Tastypie to traslate the raw object data into the fields the endpoint supports.</li>\n<li>Finally, it calls <code>Resource.create_response</code>.</li>\n</ul>\n</li>\n<li><p><code>create_response</code> is a shortcut method that:</p>\n<ul>\n<li>Determines the desired response format (<code>Resource.determine_format</code>).</li>\n<li>Serializes the data given to it in the proper format.</li>\n<li>Returns a Django <code>HttpResponse</code> (200 OK) with the serialized data.</li>\n</ul>\n</li>\n<li><p>We bubble back up the call stack to <code>dispatch</code>. The last thing <code>dispatch</code> does is potentially store that a request occured for future throttling (<code>Resource.log_throttled_access</code>) then either returns the <code>HttpResponse</code> or wraps whatever data came back in a response (so Django doesnt freak out).</p>\n</li>\n</ul>\n"}],"PostAsset":[],"PostCategory":[{"post_id":"ck99fqk4c0004subueeqgf7uv","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4g0008subum8bi5yy7"},{"post_id":"ck99fqk450000subu0lleqph1","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4h000asubur95psr19"},{"post_id":"ck99fqk4d0005subutkoz8ewr","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4i000csubu5besjv4j"},{"post_id":"ck99fqk4e0006subugxejhq3n","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4k000esubuf0s2w57y"},{"post_id":"ck99fqk4f0007subugdeybnq7","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4m000gsubu2arb3a1i"},{"post_id":"ck99fqk4g0009subu00ew2ar1","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4n000isububuqku9dk"},{"post_id":"ck99fqk4h000bsubu68ng98xy","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4o000ksubug8jthkif"},{"post_id":"ck99fqk4i000dsubujxdgfcfh","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4p000msubu7h6jk5hd"},{"post_id":"ck99fqk4m000fsubu530zs4nj","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4q000osubum3njs7uo"},{"post_id":"ck99fqk4n000hsubu5guv78od","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4r000qsubumvevrma1"},{"post_id":"ck99fqk4o000jsubub8g0257f","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4s000ssubui455cch9"},{"post_id":"ck99fqk4p000lsubu6henmdmq","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4t000usubuqhjcb82b"},{"post_id":"ck99fqk4q000nsubuw1s0x6b6","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4v000wsubu51z3nnu6"},{"post_id":"ck99fqk4r000psubu38qpnnv7","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4v000ysubuusbadjsl"},{"post_id":"ck99fqk4s000rsubusdeyspgy","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4w0010subuxxknx1yv"},{"post_id":"ck99fqk4t000tsubuyl29244j","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4x0012subub22ede3m"},{"post_id":"ck99fqk4u000vsubuzq7vic3v","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4y0014sububzo3o42i"},{"post_id":"ck99fqk4v000xsubu9bmmz6rr","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4z0016subu9ps93wal"},{"post_id":"ck99fqk4w000zsubuceivn0ao","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk500018subu54ngjaza"},{"post_id":"ck99fqk4x0011subuv9wxy1bt","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk51001asubufr4etkmp"},{"post_id":"ck99fqk4y0013subufp1wokx0","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk52001csubu04fhrgz4"},{"post_id":"ck99fqk4y0015subub2p4shuv","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk53001esubuv5io60ug"},{"post_id":"ck99fqk500017subu3v0ql53e","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk54001gsubuqay6zjd5"}],"PostTag":[],"Tag":[]}}