diff --git "a/leetcode-solutions/0371-Sum-Of-Two-Integers-\344\270\244\346\225\264\346\225\260\344\271\213\345\222\214.md" "b/leetcode-solutions/0371-Sum-Of-Two-Integers-\344\270\244\346\225\264\346\225\260\344\271\213\345\222\214.md" new file mode 100644 index 0000000..2fd7fb8 --- /dev/null +++ "b/leetcode-solutions/0371-Sum-Of-Two-Integers-\344\270\244\346\225\264\346\225\260\344\271\213\345\222\214.md" @@ -0,0 +1,114 @@ +# LeetCode [371. 两整数之和](https://leetcode-cn.com/problems/sum-of-two-integers/) + +

+ +

+ +## 题解 + +题目要求不能使用 $+、-$​,自然想到使用其他的二元运算符,我们可以根据二进制位,选择位运算符计算得到两数之和。 + +**二进制相加,思想类似于十进制加法,但从「逢十进一」变为 「逢二进一」。** + +**两个二进制位相加有以下四种情况。** + +``` +1 + 1 = 0 (进位) + +1 + 0 = 1 + +0 + 1 = 1 + +0 + 0 = 0 +``` + +直接使用异或 ^ 运算符的话,需要额外处理进位的情况, 即两个二进制位都为1。 + +我们可以使用 bit位为进位符,来判断这种情况。 + +下面考虑bit进位符,两个二进制位如何相加。 + + + +**假设现在统计到二进制的第 i 位。** + +``` +bit = 0 的情况 + +二进制位相加 运算后结果 + +1 + 1 = 0 (进位) --> 答案加 0 bit=1 +1 + 0 = 1 --> 答案加 2^i bit=0 +0 + 1 = 1 --> 答案加 2^i bit=0 +0 + 0 = 0 --> 答案加 2^i bit=0 +``` + + + +``` +bit = 1 的情况 + +二进制位相加 运算后结果 + +1 + 1 = 0 (进位) --> 答案加 2^i bit=1 +1 + 0 = 1 --> 答案加 0 bit=1 +0 + 1 = 1 --> 答案加 0 bit=1 +0 + 0 = 0 --> 答案加 2^i bit=0 +``` + +数据范围是 $-1000<=x<=1000$,如果没有负数,根据二进制位,我们只需要统计10个二进制位,因为 $2^{10}=1024>100$。 + +有负数的情况,我们需要统计到最高位,判断是否为负数,因此要统计32位。 + +时间复杂度: $O(C)$ C为常数32。 + +空间复杂度: $O(1)$。 + +## 代码 + + + +```c++ +class Solution { +public: + int getSum(int a, int b) { + int ans = 0, bit = 0; + for (int i = 0; i < 32; i++) { + int x = (a >> i) & 1, y = (b >> i) & 1; + if (x & y) { + ans |= (bit << i); + bit = 1; + } else if (x | y) { + ans |= (1 ^ bit) << i; + } else { + ans |= (bit << i); + bit = 0; + } + } + return ans; + } +}; +``` + + +## 最后 + +大家好,我是编程熊,字节跳动、旷视科技前员工,ACM亚洲区域赛金牌,欢迎 [关注我](https://leetcode-cn.com/u/bianchengxiong/) 和加入 [LeetCode组队刷题群](https://mp.weixin.qq.com/s/TsTcCDboXwnTnUeIW3Zg9Q)。 + + + +**分享几篇算法超级易懂的文章,希望对你有所帮助** + +1、[ACM金牌选手讲解LeetCode算法《线性表》](https://mp.weixin.qq.com/s/qwaYOFIksFVqZtA_nisl6g) + +2、[ACM金牌选手讲解LeetCode算法《栈和队列的高级应用》](https://mp.weixin.qq.com/s/I3DQOUmABmWav4nrAiI3Fg) + +3、[ACM金牌选手讲解LeetCode算法《哈希表》](https://mp.weixin.qq.com/s/af4gvYURUoCTfsyzsI9Www) + +4、[ACM金牌选手讲解LeetCode算法《二叉树》](https://mp.weixin.qq.com/s/8AcRNQS0Nno2_fU6kMtZeQ) + +5、[编程熊讲解LeetCode算法《堆》](https://mp.weixin.qq.com/s/ggd42G_QJ6I43F-vXSbpdA) + + + +如果题解和文章对你有所帮助,欢迎**点赞**支持。 \ No newline at end of file diff --git "a/\345\212\233\346\211\243LeetCode\351\242\230\350\247\243/0001-Two-Sum-\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/\345\212\233\346\211\243LeetCode\351\242\230\350\247\243/0001-Two-Sum-\344\270\244\346\225\260\344\271\213\345\222\214.md" new file mode 100644 index 0000000..1f39be1 --- /dev/null +++ "b/\345\212\233\346\211\243LeetCode\351\242\230\350\247\243/0001-Two-Sum-\344\270\244\346\225\260\344\271\213\345\222\214.md" @@ -0,0 +1,75 @@ +

+ +

+ +## 0001-Two-Sum-两数之和 +https://leetcode-cn.com/problems/two-sum/ + +## 题意 + +给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 + +你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 + +你可以按任意顺序返回答案。 + +**样例** + +```txt +输入:nums = [2,7,11,15], target = 9 +输出:[0,1] +解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。 +``` + + +## 题解 + +哈希可以快速查找一个数字。 + +建立哈希表,key等于数组的值,value等于值所对应的下标。 + +然后遍历数组,每次遍历到位置`i`时,检查 `target-num[i]` 是否存在,注意`target-num[i]`的位置不能等于`i`。 + +下图以示例演示一下哈希表,将数组插入到哈希表中,查找给定的`key`,即可以在`O(1)` 的时间复杂度查找到,图中的a、b、c、d指的是哈希表的索引。 + +示例 + + +## Java代码 + +```java +class Solution { + public int[] twoSum(int[] nums, int target) { + HashMap numExist = new HashMap(); + for (int i = 0; i < nums.length; ++i) { + if (numExist.containsKey(target - nums[i])) { + return new int[]{i, numExist.get(target - nums[i])}; + } + numExist.put(nums[i], i); + } + return new int[2]; + } +} +``` + +## C++代码 + +```c++ +class Solution { +public: + unordered_map numExist; + vector twoSum(vector &nums, int target) { + vector ans; + for (int i = 0; i < nums.size(); i++) { + int b = target - nums[i]; + if (numExist.count(b)) { + ans.push_back(i); + ans.push_back(numExist.at(b)); + break; + } + numExist[nums[i]] = i; + } + return ans; + } +}; +``` diff --git "a/\345\212\233\346\211\243LeetCode\351\242\230\350\247\243/0371-Sum-Of-Two-Integers-\344\270\244\346\225\264\346\225\260\344\271\213\345\222\214.md" "b/\345\212\233\346\211\243LeetCode\351\242\230\350\247\243/0371-Sum-Of-Two-Integers-\344\270\244\346\225\264\346\225\260\344\271\213\345\222\214.md" new file mode 100644 index 0000000..2fd7fb8 --- /dev/null +++ "b/\345\212\233\346\211\243LeetCode\351\242\230\350\247\243/0371-Sum-Of-Two-Integers-\344\270\244\346\225\264\346\225\260\344\271\213\345\222\214.md" @@ -0,0 +1,114 @@ +# LeetCode [371. 两整数之和](https://leetcode-cn.com/problems/sum-of-two-integers/) + +

+ +

+ +## 题解 + +题目要求不能使用 $+、-$​,自然想到使用其他的二元运算符,我们可以根据二进制位,选择位运算符计算得到两数之和。 + +**二进制相加,思想类似于十进制加法,但从「逢十进一」变为 「逢二进一」。** + +**两个二进制位相加有以下四种情况。** + +``` +1 + 1 = 0 (进位) + +1 + 0 = 1 + +0 + 1 = 1 + +0 + 0 = 0 +``` + +直接使用异或 ^ 运算符的话,需要额外处理进位的情况, 即两个二进制位都为1。 + +我们可以使用 bit位为进位符,来判断这种情况。 + +下面考虑bit进位符,两个二进制位如何相加。 + + + +**假设现在统计到二进制的第 i 位。** + +``` +bit = 0 的情况 + +二进制位相加 运算后结果 + +1 + 1 = 0 (进位) --> 答案加 0 bit=1 +1 + 0 = 1 --> 答案加 2^i bit=0 +0 + 1 = 1 --> 答案加 2^i bit=0 +0 + 0 = 0 --> 答案加 2^i bit=0 +``` + + + +``` +bit = 1 的情况 + +二进制位相加 运算后结果 + +1 + 1 = 0 (进位) --> 答案加 2^i bit=1 +1 + 0 = 1 --> 答案加 0 bit=1 +0 + 1 = 1 --> 答案加 0 bit=1 +0 + 0 = 0 --> 答案加 2^i bit=0 +``` + +数据范围是 $-1000<=x<=1000$,如果没有负数,根据二进制位,我们只需要统计10个二进制位,因为 $2^{10}=1024>100$。 + +有负数的情况,我们需要统计到最高位,判断是否为负数,因此要统计32位。 + +时间复杂度: $O(C)$ C为常数32。 + +空间复杂度: $O(1)$。 + +## 代码 + + + +```c++ +class Solution { +public: + int getSum(int a, int b) { + int ans = 0, bit = 0; + for (int i = 0; i < 32; i++) { + int x = (a >> i) & 1, y = (b >> i) & 1; + if (x & y) { + ans |= (bit << i); + bit = 1; + } else if (x | y) { + ans |= (1 ^ bit) << i; + } else { + ans |= (bit << i); + bit = 0; + } + } + return ans; + } +}; +``` + + +## 最后 + +大家好,我是编程熊,字节跳动、旷视科技前员工,ACM亚洲区域赛金牌,欢迎 [关注我](https://leetcode-cn.com/u/bianchengxiong/) 和加入 [LeetCode组队刷题群](https://mp.weixin.qq.com/s/TsTcCDboXwnTnUeIW3Zg9Q)。 + + + +**分享几篇算法超级易懂的文章,希望对你有所帮助** + +1、[ACM金牌选手讲解LeetCode算法《线性表》](https://mp.weixin.qq.com/s/qwaYOFIksFVqZtA_nisl6g) + +2、[ACM金牌选手讲解LeetCode算法《栈和队列的高级应用》](https://mp.weixin.qq.com/s/I3DQOUmABmWav4nrAiI3Fg) + +3、[ACM金牌选手讲解LeetCode算法《哈希表》](https://mp.weixin.qq.com/s/af4gvYURUoCTfsyzsI9Www) + +4、[ACM金牌选手讲解LeetCode算法《二叉树》](https://mp.weixin.qq.com/s/8AcRNQS0Nno2_fU6kMtZeQ) + +5、[编程熊讲解LeetCode算法《堆》](https://mp.weixin.qq.com/s/ggd42G_QJ6I43F-vXSbpdA) + + + +如果题解和文章对你有所帮助,欢迎**点赞**支持。 \ No newline at end of file diff --git "a/ACM\351\207\221\347\211\214\351\200\211\346\211\213\350\256\262\350\247\243LeetCode\347\256\227\346\263\225\343\200\212\345\215\225\350\260\203\346\240\210\345\222\214\346\273\221\345\212\250\347\252\227\345\217\243\343\200\213.pdf" "b/\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\345\215\225\350\260\203\346\240\210\345\222\214\346\273\221\345\212\250\347\252\227\345\217\243.pdf" similarity index 100% rename from "ACM\351\207\221\347\211\214\351\200\211\346\211\213\350\256\262\350\247\243LeetCode\347\256\227\346\263\225\343\200\212\345\215\225\350\260\203\346\240\210\345\222\214\346\273\221\345\212\250\347\252\227\345\217\243\343\200\213.pdf" rename to "\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\345\215\225\350\260\203\346\240\210\345\222\214\346\273\221\345\212\250\347\252\227\345\217\243.pdf" diff --git "a/\343\200\212\345\223\210\345\270\214\343\200\213.md" "b/\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\345\223\210\345\270\214.md" similarity index 100% rename from "\343\200\212\345\223\210\345\270\214\343\200\213.md" rename to "\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\345\223\210\345\270\214.md" diff --git "a/\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\345\240\206.pdf" "b/\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\345\240\206.pdf" new file mode 100644 index 0000000..f94e6e8 Binary files /dev/null and "b/\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\345\240\206.pdf" differ diff --git "a/ACM\351\207\221\347\211\214\351\200\211\346\211\213\350\256\262\350\247\243LeetCode\347\256\227\346\263\225\343\200\212\347\272\277\346\200\247\350\241\250\343\200\213.pdf" "b/\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\347\272\277\346\200\247\350\241\250.md" similarity index 100% rename from "ACM\351\207\221\347\211\214\351\200\211\346\211\213\350\256\262\350\247\243LeetCode\347\256\227\346\263\225\343\200\212\347\272\277\346\200\247\350\241\250\343\200\213.pdf" rename to "\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\347\272\277\346\200\247\350\241\250.md" diff --git "a/\347\256\227\346\263\225\344\271\246\347\261\215/README.md" "b/\347\256\227\346\263\225\344\271\246\347\261\215/README.md" new file mode 100644 index 0000000..ec8bc3e --- /dev/null +++ "b/\347\256\227\346\263\225\344\271\246\347\261\215/README.md" @@ -0,0 +1,24 @@ +# 算法书籍📚 + +**所有电子书在公众号【编程熊 】,扫码关注下面公众号,回复「书」 就可以免费获取下面所有计算机学习核心资料:** + +[**一键领取所有资料**](https://mp.weixin.qq.com/s/AgoVT6LkHojzG6ixbWgGJw) + +- 啊哈!算法.pdf + +- 挑战程序设计竞赛(第2版).pdf + +- 数据结构与算法分析:C语言描述_原书第2版_高清版.pdf + +- 算法 第4版 高清中文版.pdf + +- 算法图解.pdf + +- 算法导论第三版.pdf + +- 算法竞赛入门经典训练指南.pdf(高清).pdf + +- 背包九讲.pdf + + +二维码 diff --git "a/\351\242\230\350\247\243\346\250\241\346\235\277.md" "b/\351\242\230\350\247\243\346\250\241\346\235\277.md" new file mode 100644 index 0000000..6963da5 --- /dev/null +++ "b/\351\242\230\350\247\243\346\250\241\346\235\277.md" @@ -0,0 +1,37 @@ +# 题目标题 + +

+ +

+ +## 题解 + + + +## 代码 + + + + + +## 最后 + +大家好,我是编程熊,字节跳动、旷视科技前员工,ACM亚洲区域赛金牌,欢迎 [关注我](https://leetcode-cn.com/u/bianchengxiong/) 和加入 [LeetCode组队刷题群](https://mp.weixin.qq.com/s/TsTcCDboXwnTnUeIW3Zg9Q)。 + + + +**分享几篇算法超级易懂的文章,希望对你有所帮助** + +1、[ACM金牌选手讲解LeetCode算法《线性表》](https://mp.weixin.qq.com/s/qwaYOFIksFVqZtA_nisl6g) + +2、[ACM金牌选手讲解LeetCode算法《栈和队列的高级应用》](https://mp.weixin.qq.com/s/I3DQOUmABmWav4nrAiI3Fg) + +3、[ACM金牌选手讲解LeetCode算法《哈希表》](https://mp.weixin.qq.com/s/af4gvYURUoCTfsyzsI9Www) + +4、[ACM金牌选手讲解LeetCode算法《二叉树》](https://mp.weixin.qq.com/s/8AcRNQS0Nno2_fU6kMtZeQ) + +5、[编程熊讲解LeetCode算法《堆》](https://mp.weixin.qq.com/s/ggd42G_QJ6I43F-vXSbpdA) + + + +如果题解和文章对你有所帮助,欢迎**点赞**支持。 \ No newline at end of file