个人觉得这个模块还是很不错的,适合像我一样初学算法的童鞋入门,我一般使用c++做题的(c和java也会 )
下面会简单介绍一下我的对每个题目的想法,之后可能会录制讲解视频放到B站供童鞋们参考!
给定 nums = [0,0,1,1,1,2,2,3,3,4]
首先我们需要设定一个变量用来记录去重后数组的长度,我们从下标为1处开始,比较前一个数是否与当前的数相等,如果相等的话,就判断下一个,直到找到不相等的时候,然后让去重的数组的长度加1,并且把这个未出现过的值添加到去重的数组里
对于下标为0的值首先添加到去重数组,长度加1,然后再往后判断,0与0相等,然后判断下一个,1与0不相等,那么将1添加到去重数组…依次类推就可以得到正确答案:0 1 2 3 4
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int sum = 0;
for(int i = 0; i < nums.size(); i++)
if(i == 0 || nums[i] != nums[i-1]) nums[sum++]=nums[i];
return sum;
}
};
class Solution {
public:
int maxProfit(vector<int>& prices) {
int sum = 0;
for(int i = 1; i < prices.size(); i++)
if(prices[i] > prices[i-1]) sum += prices[i] - prices[i-1];
return sum;
}
};
class Solution {
public:
void rotate(vector<int>& nums, int k) {
k %= nums.size();
reverse(nums.begin(),nums.end());
reverse(nums.begin(),nums.begin()+k);
reverse(nums.begin()+k,nums.end());
}
};
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
sort(nums.begin(),nums.end());
for(int i = 1; i < nums.size(); i++){
if(nums[i-1] == nums[i]) return true;
}
return false;
}
};
class Solution {
public:
int singleNumber(vector<int>& nums) {
int num=0;
for(int i : nums) num ^= i;
return num;
}
};
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
vector<int> nums3;
sort(nums1.begin(),nums1.end());
sort(nums2.begin(),nums2.end());
for(int i=0,j=0;i<nums1.size()&&j<nums2.size();){
if(nums1[i]==nums2[j]){
nums3.push_back(nums1[i]);
i++;
j++;
}else if(nums1[i]>nums2[j]){
j++;
}else{
i++;
}
}
return nums3;
}
};
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
reverse(digits.begin(),digits.end());
int tmp=0;
digits[0]++;
for(int i=0;i<digits.size();i++){
digits[i] += tmp;
tmp = digits[i] /10;
digits[i] %= 10;
}
if(tmp) digits.push_back(tmp);
reverse(digits.begin(),digits.end());
return digits;
}
};
class Solution {
public:
void moveZeroes(vector<int>& nums) {
for(int i=0,j=0;i<nums.size();i++){
if(nums[i]){
if(i!=j) swap(nums[j],nums[i]);
j++;
}
}
}
};
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> ans;
vector<int> temp;
temp=nums;
int n=temp.size();
sort(temp.begin(),temp.end());
int i=0,j=n-1;
while(i<j){
if(temp[i]+temp[j]>target)j--;
else if(temp[i]+temp[j]<target)i++;
else break;
}
if(i<j){
for(int k=0;k<n;k++){
if(i<n&&nums[k]==temp[i]){
ans.push_back(k);
i=n;
}
else if(j<n&&nums[k]==temp[j]){
ans.push_back(k);
j=n;
}
if(i==n&&j==n)return ans;
}
}
return ans;
}
};
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
int row[9][9] ={};
int col[9][9] ={};
int block[9][9] ={};
for(int i = 0; i < 9; i++){
for(int j = 0; j < 9; j++){
if(board[i][j] != '.'){
if(row[i][board[i][j]-'1']++) return false;
else if(col[j][board[i][j]-'1']++) return false;
else if(block[(i/3)*3+j/3][board[i][j]-'1']++) return false;
}
}
}
return true;
}
};
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int cycle = matrix.size() / 2, len = matrix.size(), tmp,t;
for(int i = 0; i < cycle; i++){
for(int j = i; j < len - 1 - i; j++){
tmp = matrix[i][j];
matrix[i][j] = matrix[len - 1 -j][i];
t = matrix[j][len - 1 - i];
matrix[j][len - 1 - i] = tmp;
tmp = matrix[len - 1 - i][len - 1 -j];
matrix[len - 1 - i][len - 1 - j] = t;
matrix[len - 1 - j][i] = tmp;
}
}
}
};
这些题目看着简单,但是题目给出了一些限制条件,我们平时使用的方法可能就被限制了,需要我们拓展思维,思考其他的方法来解决问题!