LeetCode 029 — Divide Two Integers

Divide Two Integers https://leetcode.com/problems/divide-two-integers/ 题目要求不用乘法、除法和取模运算符,实现整型除法运算。 既然不能用乘法和除法运算符,那么基本思路就是用减法来代替。不过如果用每次循环减一次被除数这种方式,是肯定会超时的。所以要想办法加速运算。 Solution class Solution { public: int divide(int dividend, int divisor) { long long quotient = 0; int flag = 1; auto dividend1 = (long long)fabs(dividend); auto divisor1 = (long long)fabs(divisor); if(dividend < 0) { flag = -1; } if(divisor < 0) { flag = flag == 1 ? -1 : 1; } std::vector<std::pair<long long, long long> > vec; long long times = 1; while (dividend1 >= divisor1) { vec....

2019-05-11 · 2 min · 白熊

LeetCode 011 — Container With Most Water

Container With Most Water https://leetcode.com/problems/container-with-most-water/ 给定一个整型数组,表示坐标轴上的一组相应长度的垂直于 x 轴的线段,要求找出两条线跟 x 轴围起来的容器,能装最多的水。 这题一开始我想用最暴力的方法做两层循环O(n^2)的解法提交试一下,可惜超时了,果然 Medium 难度的题目不会这么轻松放我过去的。 既然 O(n^2) 的解法没有办法通过,那就要想办法能不能找出 O(n) 的解法,一遍循环弄出来。我绞尽脑汁想了很久,尝试了好几种方案,始终没有办法解决。我最终不得不求助于前人的经验,看到别人的解法之后,顿时觉得豁然开朗。 Solution class Solution { public: int maxArea(vector<int>& height) { int max_area = 0; int area = 0; int i = 0; int j = height.size() - 1; while(i < j) { if(height[i] > height[j]) { area = (j - i) * height[j]; --j; } else { area = (j - i) * height[i]; ++i; } if(area > max_area) { max_area = area; } } return max_area; } }; 其实这个解法的关键是用两个指针,分别从左右两边向中间开始遍历,每次算出当前两个指针所指的线围成的面积,并比较是不是当前最大的记到 max_area 里,然后每次排除较短的一条线段,继续遍历。...

2019-04-27 · 1 min · 白熊

LeetCode 003 — Longest Substring Without Repeating Characters

Longest Substring Without Repeating Characters https://leetcode.com/problems/longest-substring-without-repeating-characters/ 给定一个字符串,找出最长不重复子串的长度。 Solution 1 第一个解决方案依然采取最直观的方式,就是做两层遍历,从前往后逐个字符比较。 class Solution { public: int lengthOfLongestSubstring(string s) { int length = 0; for (int i = 0; i < s.length(); ++i) { int sub_length = 1; string sub_str = s.substr(i, sub_length); for (int j = i + 1; j < s.length(); ++j) { if (sub_str.find(s[j]) != string::npos) { break; } sub_str += s[j]; sub_length++; } if (sub_length > length) { length = sub_length; } } return length; } }; 提交代码,Accepted,但是 Runtime 164ms,太惨了…...

2016-06-29 · 2 min · 白熊

LeetCode 001 — Two Sum

最近开始撸 LeetCode,在这里做个简单的记录。撸 LeetCode 也不是因为闲来无事,只是觉得在工作之外需要继续锻炼。初步打算按照Problems 的题号来撸,Easy 优先,其他难度的撸不过可以先跳过,以后再来一遍也未尝不可,保持自信心比较重要。 Two Sum https://leetcode.com/problems/two-sum/ 题目大意是给定一个 int 数组,要求返回数组中两个数的下标值的数组,并且满足这两个数的和等于一个给定的目标值。并且假定每一个测试用例只有一个确定的结果。 Solution 1 这题最容易想到的方法,自然是最暴力的两个 for 循环的遍历,实现如下: class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { bool is_get = false; int i = 0; int j = 0; for (; i < nums.size(); i++) { for (j = i + 1; j < nums.size(); j++) { if (nums[i] + nums[j] == target) { is_get = true; break; } } if (is_get) { break; } } vector<int> v; v....

2016-03-22 · 2 min · 白熊