- 博客(152)
- 收藏
- 关注
原创 特殊二分总结:shopee二面算法题(又是该死的二分
最近面了shopee新加坡office,在二面中遇到了一道有意思的题目。题目分为两部分,开始比较简单,followup会有难度(但是也是之前遇到过总结过的二分,但是该死的又是没有自己想出来题目:给出一个升序数组,其中每个数字代表的是每个空位置的坐标。现在要给三个人安排位置,要求使他们之间距离最大(以相邻两个人距离中较小的距离为距离)解法:首先肯定要把一个安排在最左边,一个在最右边(贪心,...
2019-11-08 15:57:10
1969
原创 KS 2018 RoundA:第三题
这一题学到了新的技巧,以及需要注意的很多细节(类似这种竞赛题目和平时leetcode做题目的区别)首先是小数据集的做法:很自然的,对dict里面的每个词在字符串里面找是不是有符合条件的子串,找的时候肯定使用滑动窗口,计算每个字符出现的频率。然后是大数据集的做法:不能够使用一个词一个词地找这种做法,因为词的数量太多。但是考虑到:如果所有词的长度和为M,那么不同长度的数量最多为sqrt...
2019-11-04 20:32:11
240
原创 1039. Minimum Score Triangulation of Polygon
做这题的时候犯的错误应该是:只看到了自己画出来的,举的几个例子,而没有将它抽象出来,得到一个普遍的方法。先说自己开始的做法:(是错误的)class Solution {public: int minScoreTriangulation(vector<int>& A) { int sz = A.size(); if (sz &l...
2019-11-04 11:00:11
292
原创 优先队列自定义的注意点
自定义优先队列结构的注意点:1.优先队列顺序和自己定义的是反的,而且默认大根堆2.需要自己定义顺序的时候。1)需要写出container,一般就是vector 2)写比较器就是像自己这里写的这样。3.一般如果不是自定义结构的话,而且只需要改为小根堆,使用greater就行比较器的例子:struct cmp { bool operator() (pair<int, pair&...
2019-11-03 16:09:26
231
原创 KS 2018 Round A:第二题
这一题我快做出阴影了,当然题目不好做,我看了别人的讲解才做出来,但是自己实现的时候各种狗屁错误,我tm。。。本题做法:E(k):表示可以redip k次的最优期望。E(0) = sum(Vi) / NE(k): 如果取出的v > E(k-1),那么留下;否则redip。转移方程为:E(k) = (smallerCount * E(k-1) + largerSum) / N;这里...
2019-11-01 21:40:48
141
原创 926. Flip String to Monotone Increasing
又是一题很有意思的题目。而且是自己想出来的:)开始想了一些其他的方法,dp,但是不管用,后来就想可能不是通用解法,而是有自己的解法的。思路是这样的:题目的意思翻译过来,就是数组从前往后找到一个位置,该位置前面的1全变为0,该位置后面的0全变为1,找到一个位置使这样的变换最少。但是我们需要每次一个位置都把它左右全部都扫描一遍找到需要的变换数吗?不需要,只需要两个数组,分别记录从左到右的1的...
2019-10-31 20:12:44
171
原创 395. Longest Substring with At Least K Repeating Characters
这一题很有启发意义,自己的分治不太会用,这一题如果想不到分治确实其他方法就不太好用了。class Solution {public: int longestSubstring(string s, int k) { return helper(s, 0, s.size()-1, k); }private: int helper(string& ...
2019-10-31 19:48:07
118
原创 140. Word Break II
缓存的重要性:方法一:直接dfs,TLEclass Solution {public: vector<string> wordBreak(string s, vector<string>& wordDict) { unordered_set<string> dict(wordDict.begin(), wordDict.e...
2019-10-28 10:26:50
115
原创 871. Minimum Number of Refueling Stops
难得,自己想出来的hard。class Solution {public: int minRefuelStops(int target, int startFuel, vector<vector<int>>& stations) { int remain = startFuel; priority_queue<in...
2019-10-27 21:03:04
132
原创 KS 2018 Round A:第一题
#include <iostream>#include <vector>#include <algorithm>#include "math.h"using namespace std;long long fun(long long num);int main() { int T; cin >> T; long...
2019-10-26 20:54:35
159
1
原创 421. Maximum XOR of Two Numbers in an Array
class Solution {public: int findMaximumXOR(vector<int>& nums) { int max = 0, mask = 0; for (int i = 31; i >= 0; --i) { mask |= (1 << i); ...
2019-10-25 11:32:06
119
原创 60. Permutation Sequence
只是想说一个错误的解法:class Solution {public: string getPermutation(int n, int k) { string num = string(""); for (char c = 1; c <= n; ++c) num += to_string(c); dfs(...
2019-10-24 19:29:18
142
原创 987. Vertical Order Traversal of a Binary Tree
终于做到了这一题,发现这一题不是这么好做,细节有点多。首先,考虑bfs还是dfs。因为会有重叠,选用bfs。然后考虑怎么确定每个点在哪一列当中,我们记录每个点它的x(以root的x为0),然后记录x为0的那一列的index是多少,然后可以确定下来。ok,然后我们层序遍历,需要注意重叠的情况,重点是重叠的情况:1.可能不止两个会重叠在一起。2.普通的层序遍历,重叠在一起的不一定会在que...
2019-10-24 16:21:31
118
原创 854. K-Similar Strings
回溯法还是比较好理解的,但是遗憾自己没有写出来。class Solution {public: int kSimilarity(string A, string B) { unordered_map<string, int> memo; return backtrack(A, B, memo, 0); }private: ...
2019-10-24 10:37:47
193
原创 43. Multiply Strings
发现了简单的做法:class Solution {public: string multiply(string num1, string num2) { reverse(num1.begin(), num1.end()); reverse(num2.begin(), num2.end()); int sz1 = num1.size(),...
2019-10-21 09:49:52
105
原创 36. Valid Sudoku
之前没有写过这么简洁的方法:class Solution {public: bool isValidSudoku(vector<vector<char>>& board) { int used1[9][9] = {0}, used2[9][9] = {0}, used3[9][9] = {0}; for (int i =...
2019-10-20 09:35:32
111
原创 653. Two Sum IV - Input is a BST
三种方法:1./** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }...
2019-10-17 11:04:22
121
原创 713. Subarray Product Less Than K
暴力解法:class Solution {public: int numSubarrayProductLessThanK(vector<int>& nums, int k) { if (k == 0) return 0; int retCnt = 0; for (int i = 0; i &l...
2019-10-17 11:02:41
123
原创 659. Split Array into Consecutive Subsequences
这题还是很有意思的。class Solution {public: bool isPossible(vector<int>& nums) { unordered_map<int, int> dict, temp;//dict存储还没有分配的数字,temp存储已经ok的所有序列的下一个可添加的数字 for (int num...
2019-10-16 10:41:57
103
原创 90. Subsets II
这道题写的时候有一些疑惑的地方,这里再记录一下class Solution {public: vector<vector<int>> subsetsWithDup(vector<int>& nums) { vector<vector<int>> ret; vector<int&g...
2019-10-12 10:25:33
85
原创 1031. Maximum Sum of Two Non-Overlapping Subarrays
又一次见识到了与大佬的差距。首先自己的做法:将以每个数字为结尾的长度为L或者M的连续子数组的和记录下来,然后分别计算L在前面和M在前面的情况。其实就是暴力法。class Solution {public: int maxSumTwoNoOverlap(vector<int>& A, int L, int M) { int sz = A.siz...
2019-10-10 15:43:02
120
原创 131. Palindrome Partitioning
这道题目竟然做起来感觉有点困难,真是。。。先是自己想了一个奇怪的写法:class Solution {public: vector<vector<string>> partition(string s) { if (s.empty()) return vector<vector<string>>...
2019-10-10 11:28:32
66
原创 890. Find and Replace Pattern
方法一:两个map分别记录下每对char的对应关系。class Solution {public: vector<string> findAndReplacePattern(vector<string>& words, string pattern) { vector<string> res; for (a...
2019-10-09 17:20:04
65
原创 187. Repeated DNA Sequences
学习一下如何编码来节省空间。首先自己的做法简单粗暴:class Solution {public: vector<string> findRepeatedDnaSequences(string s) { if (s.size() < 10) return vector<string>(); uno...
2019-10-08 11:32:08
74
原创 979. Distribute Coins in Binary Tree
这题很有意思,本来认为树的题目没有什么难的了,但是这题确实想了很久也没有做出来。class Solution {public: int distributeCoins(TreeNode* root) { int moves = 0; assert(dfs(root, moves) == 0); return moves; }p...
2019-10-07 19:34:31
147
原创 668. Kth Smallest Number in Multiplication Table
又是一题可以二分的题目没有看出来。。。我已经对自己的智商不抱希望了。。。首先:1.明确的上下界:最小为0,最大为m*n2.明确的分界线:我们对于每个数,数在乘法表中小于等于它的数的个数,那么它和k的关系应该是这样:小于|等于|大于。其中等于的那一段是因为整除的缘故,所以我们要的是等于中最小的那一个。难点是:1.想到二分(我尼玛这什么智商)2.想到数小于该数的个数,以及想到该怎么数。cl...
2019-10-07 16:58:42
144
原创 805. Split Array With Same Average
只是再次验证了自己之前的想法:难题目只是由几个小的,不太难的子题目组成的。把子题目明确定义出来,逐个击破即可。(另外下面的想法我之前想到了,只是没想到就是这么简单。。。。)分成两组,两组平均值一样。那么总的平均值一样,可以算出来。那么我们就可以把题目转化为:是否能够一组数,它们的和是个数*平均值。那么这个个数也不是都可以的,因为这个个数乘以平均值也必须为整数。另外,我们可以找个数少的那一组,最...
2019-10-07 15:56:39
108
原创 705. Design HashSet
这一题意义还是很重大的,因为很可能面试的时候问你是怎么做的,或者有什么思路,能说几个是几个。方法一:针对这一题,因为元素大小有限制,所以可以直接申请一个这么大的数组,表示有没有。class MyHashSet {public: /** Initialize your data structure here. */ MyHashSet():values(1000001, f...
2019-10-07 15:27:35
100
原创 318. Maximum Product of Word Lengths
一个是自己太蠢,没有想到应该想出来的方法。还有一个是C++的坑(还是自己理解有错??)首先自己的想法是对于每个单词申请一个26大小的数组,记录每个单词中字符是否出现。然后每一对都比对一下。但是自己忘了之前做过的题目中,如果只有26个字母的话,可以用一个int来表示一个字符有没有出现。而且的话,对比一个字符有没有同时出现,对它们的值进行&就行了,就不用一个一个比对了,同时节省了时间和空...
2019-10-06 15:23:41
82
原创 454. 4Sum II
这题自己先想的是用之前做类似题目的方法,就是遍历两个,然后用两个指针一高一低,然后往中间遍历。遇到的问题是如果有重复值怎么办?下面的做法是评论区看来的,而且时间复杂度只有O(n^2),很遗憾自己没有想出来class Solution {public: int fourSumCount(vector<int>& A, vector<int>& ...
2019-10-06 14:50:47
82
原创 826. Most Profit Assigning Work
这一题做出来了,但是不必要的步骤比较多,也就是不够简洁。自己的做法:按照利润由高到低排序,如果某一些排在后面的难度却更高,就删掉它们。class Solution {public: int maxProfitAssignment(vector<int>& difficulty, vector<int>& profit, vector<...
2019-10-05 17:20:48
102
原创 1047. Remove All Adjacent Duplicates In String
做法比较有意思的一道题目。方法一:栈class Solution {public: string removeDuplicates(string S) { stack<char> sc; for (char c : S) { if (!sc.empty() && sc.top() == c) ...
2019-10-04 22:16:43
82
原创 1014. Best Sightseeing Pair
自己思路是从:最大盛水的容器那个思路,到单调栈的思路,再到认识到我们只需要记录一个最好的点就可以了。class Solution {public: int maxScoreSightseeingPair(vector<int>& A) { int maxScore = 0; int index = 0; for (i...
2019-10-04 22:00:18
241
原创 343. Integer Break
一个比较数学的题目,但是可以用自己的方法做出来。稍微对这一道题目有点印象就可以了。自己的方法:dpclass Solution {public: int integerBreak(int n) { if (n < 2) return 0; vector<int> dp(n+1, 0); dp...
2019-10-04 20:56:44
91
原创 525. Contiguous Array & 325. Maximum Size Subarray Sum Equals k
一道之前知道思路的题目,差点翻车没有做出来。自己没想起来之前想到的方法有:dp,滑动窗口,前缀和。这次能够都想到滑动窗口和前缀和是不错的,因为这种区间的题目就应该这样。只不过没有下面这个特殊的思路确实不太好思考。把所有的0当成-1,计算前缀和。一段区间中它的和为0,表示其中0和1个数相等。不需要真的计算每段区间,因为只要最长区间,保持每个前缀和出现的最小位置。class Solution ...
2019-10-04 20:09:58
108
原创 327. Count of Range Sum
少有的一道自己很快做出来,没有错误的hard题目,可喜可贺。。。方法一:第一反应就是前缀和:class Solution {public: int countRangeSum(vector<int>& nums, int lower, int upper) { int sz = nums.size(); if (sz == 0)...
2019-10-03 21:24:29
108
原创 720. Longest Word in Dictionary
一条easy的题目,但是感觉不是那么容易做的。第一思路是使用set,去重+排序,然后一个一个遍历,但是的话感觉总是不好做。然后才使用了其他方法。方法一:图+bfs类似这种每个单词之间隔着一个字母就相当于有一条边连着的思想之前遇到过。这里也是类似的思路,但是的话时间消耗有点长。class Solution {public: string longestWord(vector&l...
2019-10-03 20:34:53
124
原创 949. Largest Time for Given Digits
很有意思的一道题目,有几种不同的思路。首先我自己的思路:把每一种permutation都列举出来(用到了之前自己不太理解的swap的方法,还挺好用的),如果符合时间要求,就转化为string,然后保存最大的一个:class Solution {public: string largestTimeFromDigits(vector<int>& A) { ...
2019-09-30 21:56:48
82
原创 134. Gas Station
这题的基本方法和优化方法都是自己想出来的:)面试的时候这就是理想的答题步骤,先快速的说出最基本的暴力解法,然后进一步主动说出优化的方法。一:暴力方法。很简单,一个一个位置实验:class Solution {public: int canCompleteCircuit(vector<int>& gas, vector<int>& cost...
2019-09-30 20:51:35
74
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人