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....
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 里,然后每次排除较短的一条线段,继续遍历。...
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,太惨了…...
最近开始撸 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....