因为发现每日只做一题速度着实有点太慢了,所以我打算把每日一题增加到每日三题,但标题还叫作“每日一题”。
1.leetcode380
这一题感觉主要考对stl容器时间复杂度的理解。
像unordered_map、unordered_set这种,底层实现逻辑是哈希表,可以做到增加和删除都是O(1)。
我的代码:
class RandomizedSet {
unordered_set<int> set;
public:
RandomizedSet() {
}
bool insert(int val) {
if(set.find(val)==set.end()){
set.insert(val);
return true;
}
return false;
}
bool remove(int val) {
if(set.find(val)!=set.end()){
set.erase(val);
return true;
}
return false;
}
int getRandom() {
auto it = set.begin();
advance(it,rand()%set.size());
return *it;
}
};
注意,最后一个getRandom()函数其实取得不太均匀(具体怎么不均匀网上有解释,暂时先不管)
2.leetcode238
这一题题目要求不能有除法。计算数组除了该元素本身之外的所有元素的乘积方法就是这个值等于该元素左边所有元素的乘积乘上该元素右边所有元素的乘积。所以用两个数组记录上述的值即可。
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
vector<int> left;
vector<int> right;
left.assign(nums.size(),1);
right.assign(nums.size(),1);
for(int i=1;i<nums.size();i++){
left[i]=left[i-1]*nums[i-1];
}
for(int i=nums.size()-2;i>=0;i--){
right[i]=right[i+1]*nums[i+1];
}
for(int i=0;i<nums.size();i++){
nums[i] = left[i]*right[i];
}
return nums;
}
};
3.leetcode134
这个问题的关键在于:如果从index=0开始,只能走到index=i,那么说明从index=0~index=i之间的任何一个地方出发,都到不了index=i+1,所以乖乖从index=i+1再次出发即可。(这样的idea我怎么就想不到呢?!)
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int n=gas.size();
int success = 0;
int index = -1;
int i=0;
while(i<n){
int j=i;
int tank=gas[i]-cost[i];
int num=0;
while(tank>=0){
num++;
if(num==n){
success = 1;
break;
}
j=(j+1)%n;
tank = tank+gas[j]-cost[j];
}
if(success==1){
index = i;
break;
}else{
if((j+1)%n<=i){
break;
}else{
i=(j+1)%n;
}
}
}
return index;
}
};
注:写的过程就已经参考hint了,所以没有把别人的代码放出来,大差不差。