Array(easy)
1. Two Sum
class Solution
{
public:
vector<int>twoSum(vector<int>& nums, int target)
{
vector<int> vec;
map<int,int> index;
for(int i=0;i<nums.size();i++)
{
if(index.find(target-nums[i])!=index.end())
{
vec.push_back(index[target-nums[i]]);
vec.push_back(i);
break;
}
index[nums[i]]=i;
}
return vec;
}
};
26. Remove Duplicates from Sorted Array
class Solution {
public:
int removeDuplicates(vector<int>&nums)
/*{
if(nums.size()<=1)
return nums.size();
int length=1;
for(int i=1;i<nums.size();i++)
{
if(nums[i]!=nums[i-1])
{
nums[length++]=nums[i];
}
}
return length;
}*/
{
if(nums.size()<=1)
return nums.size();
int pos=0;
int j=1;
for(j=1;j<nums.size();j++)
{
if(nums[j]!=nums[pos])
{
pos++;
nums[pos]=nums[j];
}
}
return pos+1;
}
};
27. Remove Element
class Solution {
public:
int removeElement(vector<int>&nums, int val)
{
int length=nums.size();
if(length==0)
return length;
if(length==1)
{
if(nums[0]==val)
return 0;
else
return length;
}
int j;
int pos=0;
for(j=0;j<length;j++)
{
if(nums[j]!=val)
{
nums[pos]=nums[j];
pos++;
}
}
return pos;
}
35. Search Insert Position
class Solution {
public:
int searchInsert(vector<int>&nums, int target)
{
int length=nums.size();
int low=0;
int high=length-1;
while(low<=high)
{
int mid=(low+high)/2;
if(target>nums[mid])
low=mid+1;
else if(target<nums[mid])
high=mid-1;
else
return mid;
}
return low;
}
};
53. Maximum Subarray
动态规划
class Solution {
public:
int maxSubArray(vector<int>&nums)
/*{
int max=nums[0];
int sum=0;
for(int i=0;i<nums.size();i++)
{
sum+=nums[i];//必须从nums[0]开始加,如果nums[0]小于0,则后面判断时舍
if(sum>max)
max=sum;
if(sum<0)
sum=0;
}
return max;
}*/
};
分治法
class Solution {
public:
int maxSubArray(vector<int>&nums)
{
returndivideconquer(nums,0,nums.size()-1);
}
int divideconquer(vector<int>&a,int left,int right)
{
if (left == right)
return a[left]; //注意递归终止条件
int middle = (left + right) / 2;
int leftans = divideconquer(a,left, middle); //计算左区间和右区间
int rightans = divideconquer(a,middle+1, right);
//求middle从中间向两遍扫
int leftmax = a[middle];
int rightmax = a[middle+1];
int temp=0;
for (int i = middle; i >= left;i--)
{
temp += a[i];
if(temp>leftmax)
leftmax = temp;
}
temp = 0;
for (int i = middle+1; i <=right; i++)
{
temp += a[i];
if(temp>rightmax)
rightmax=temp;
}
return max(max(leftans, rightans),leftmax + rightmax);
}
};66. Plus One
class Solution {
public:
vector<int>plusOne(vector<int>& digits)
{
int c=1;
for(int i=digits.size()-1;i>=0;i--)
{
int temp=digits[i]+c;
digits[i]=temp%10;
c=temp/10;
}
if(c==1)
{
digits.insert(digits.begin(),1);
}
return digits;
}
};
88. Merge Sorted Array
class Solution {
public:
void merge(vector<int>& nums1,int m, vector<int>& nums2, int n)
{
int i=m-1;
int j=n-1;
int k=m+n-1;
while(i>=0&&j>=0)
{
if(nums1[i]>nums2[j])
nums1[k--]=nums1[i--];
else
nums1[k--]=nums2[j--];
}
while(j>=0)
{
nums1[k--]=nums2[j--];
}
}
};
118. Pascal's Triangle
class Solution {
public:
vector<vector<int>>generate(int numRows)
{
int i=0,j=0;
vector<vector<int>> allvec;
for(int i=0;i<numRows;i++)
{
vector<int> vec;
for(int j=0;j<=i;j++)
{
if(j==0||i==j)
vec.push_back(1);
else
vec.push_back(allvec[i-1][j-1]+allvec[i-1][j]);
}
allvec.push_back(vec);
}
return allvec;
}
};119. Pascal's Triangle II
class Solution {
public:
vector<int> getRow(int rowIndex)
{
vector<int> vec;
for(int i=0;i<=rowIndex;i++)
{
vec.push_back(1);
for(int j=i-1;j>0;j--)
vec[j]=vec[j-1]+ vec[j];
}
return vec;
}
};
121. Best Time to Buy and Sell Stock
class Solution {
public:
int maxProfit(vector<int>&prices)
{
int size=prices.size();
int min=0,max=0;
for(int i=0;i<size;i++)
{
if(prices[i]<prices[min])
min=i;
if(max<prices[i]-prices[min])
max=prices[i]-prices[min];
}
return max;
}
};
122. Best Time to Buy and Sell Stock II
class Solution {
public:
int maxProfit(vector<int>&prices)
{
int summax=0;
for(int i=1;i<prices.size();++i)
{
if(prices[i]>prices[i-1])
summax+=prices[i]-prices[i-1];
}
return summax;
}
};
class Solution {
public:
int maxProfit(vector<int>&prices)
{
int sum=0;
int size=prices.size();
for(int i=0;i<size-1;i++)
{
if(prices[i+1]>prices[i])
sum+=(prices[i+1]-prices[i]);
}
return sum;
}
};
136. Single Number
class Solution {
public:
int singleNumber(vector<int>&nums)
/*{
int result=0;
for(int i=0;i<nums.size();i++)
{
result^=nums[i];
}
return result;
}*/
{
set<int> temp;
for(int i=0;i<nums.size();i++)
{
set<int>::iteratorresult=temp.find(nums[i]);
if(result==temp.end())
temp.insert(nums[i]);
else
temp.erase(nums[i]);
}
return *temp.begin(); //*temp.begin()是set的第一个元素
}
};
167. Two Sum II - Input array is sorted
class Solution {
public:
vector<int>twoSum(vector<int>& numbers, int target)
{
vector<int> vec;
int i=0,j=numbers.size()-1;
while(i!=j)
{
if(numbers[i]+numbers[j]==target)
{
vec.push_back(i+1);
vec.push_back(j+1);
break;
}
elseif(numbers[i]+numbers[j]<target)
i++;
else
j--;
}
return vec;
}
};
169. Majority Element
class Solution {
public:
int majorityElement(vector<int>&nums)
/*{
map<int,int> im;
for(int i=0;i<nums.size();i++)
{
map<int,int>::iteratorit=im.find(nums[i]);
if(it==im.end())
im[nums[i]]=1;
else
im[nums[i]]++;
if(im[nums[i]]>nums.size()/2)
return nums[i];
}
}*/
{
int major;
int cnt=0;
int i=0;
for(int i=0;i<nums.size();i++)
{
if(cnt==0)
{
major=nums[i];
cnt=1;
}
else
{
major==nums[i]?cnt++:cnt--;
}
}
return major;
}
};
class Solution {
public:
int majorityElement(vector<int>&nums)
{
map<int,int> index;
int n=nums.size();
for(int i=0;i<n;i++)
index[nums[i]]++;
map<int,int>::iterator it;
for(it=index.begin();it!=index.end();it++)
{
if(it->second>n/2)
return it->first;
}
}
};
189. Rotate Array
class Solution {
public:
void rotate(vector<int>& nums,int k)
/*{
if(nums.size()==1) return;
if(k>nums.size()) k%=nums.size();
vector<int> vec;
for(inti=nums.size()-k;i<nums.size();i++)
{
vec.push_back(nums[i]);
}
for(int i=0;i<nums.size()-k;i++)
{
vec.push_back(nums[i]);
}
nums=vec;
}*/
/*{
k%=nums.size();
if(k==0) return;
int *temp=new int[nums.size()];
memcpy(temp,&nums[0]+(nums.size()-k),sizeof(int)*k);
memcpy(temp+k,&nums[0],sizeof(int)*(nums.size()-k));
memcpy(&nums[0], temp,sizeof(int)*(nums.size()));
delete[] temp;
} */
{
int n=nums.size();
k%=n; //1234567
reverse(nums,0,n-1);//7654321
reverse(nums,0,k-1);//5674321
reverse(nums,k,n-1);//5671234
return;
}
void reverse(vector<int>& arr,intstart,int end)
{
int i=start;
int j=end;
int temp;
for(i,j;i<j;i++,j--)
{
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
return;
}
};
217. Contains Duplicate
class Solution {
public:
boolcontainsDuplicate(vector<int>& nums)
/*{
map<int,int>index;
for(int i=0;i<nums.size();i++)
{
if(index.count(nums[i]))
return true;
index[nums[i]]=1;
}
return false;
}*/
/*{
set<int>s(nums.begin(),nums.end());
if(s.size()!=nums.size())
return true;
else
return false;
}*/
{
sort(nums.begin(),nums.end());
if(unique(nums.begin(),nums.end())!=nums.end())
return true;
else
return false;
}
};
class Solution {
public:
boolcontainsDuplicate(vector<int>& nums)
{
map<int,int> index;
for(int i=0;i<nums.size();i++)
index[nums[i]]++;
map<int,int>::iteratorit=index.begin();
for(;it!=index.end();it++)
{
if(it->second>=2)
return true;
}
return false;
}
};
219. Contains Duplicate II
class Solution {
public:
boolcontainsNearbyDuplicate(vector<int>& nums, int k)
{
map<int,int> index;
int j;
for(int i=0;i<nums.size();i++)
{
if(index.find(nums[i])!=index.end()&&(i-index[nums[i]])<=k)
{
return true;
}
index[nums[i]]=i;
}
return false;
}
};
268. Missing Number
class Solution {
public:
int missingNumber(vector<int>&nums)
{
intresult=(1+nums.size())*nums.size()/2;
for(int i=0;i<nums.size();i++)
{
result-=nums[i];
}
return result;
}
};
283. Move Zeroes
class Solution {
public:
void moveZeroes(vector<int>&nums)
{
int pos=0;
for(int i=0;i<nums.size();i++)
{
if(nums[i]!=0)
{
nums[pos]=nums[i];
pos++;
}
}
for(int i=pos;i<nums.size();i++)
{
nums[i]=0;
}
}
};
414. Third Maximum Number
class Solution {
public:
/* //注意这里有个坑,就是初始化要用长整型long的最小值,否则当数组中有INT_MIN存在时,程序就不知道该返回INT_MIN还是最大值first
int thirdMax(vector<int>& nums)
{
longfirst=LONG_MIN,second=LONG_MIN,third=LONG_MIN;
for(int num:nums)
{
if(num>first)
{
third=second;
second=first;
first=num;
}
elseif(num>second&&num<first)
{
third=second;
second=num;
}
elseif(num>third&&num<second)
third=num;
}
return(third==LONG_MIN||third==second)?first:third;
}
*/
//时间复杂度是O(nlogn),不符合题目要求,纯粹是拓宽下思路哈,利用了set的自动排序和自动去重复项的特性,很好的解决了问题,对于遍历到的数字,加入set中,重复项就自动去掉了,如果此时set大小大于3个了,那么我们把set的第一个元素去掉,也就是将第四大的数字去掉,那么就可以看出set始终维护的是最大的三个不同的数字,最后遍历结束后,我们看set的大小是否为3,是的话就返回首元素,不是的话就返回尾元素
int thirdMax(vector<int>& nums)
{
set<int> s;
for(int num:nums)
{
s.insert(num);
if(s.size()>3)
{
s.erase(s.begin());
}
}
return s.size()==3?*s.begin():*s.rbegin();
}
};
448. Find All Numbers Disappeared in an Array
class Solution {
public:
vector<int>findDisappearedNumbers(vector<int>& nums)
{
vector<int> vec;
for(int i=0;i<nums.size();i++)
{
if(nums[abs(nums[i])-1]>0)
nums[abs(nums[i])-1]=-nums[abs(nums[i])-1];
}
for(int i=0;i<nums.size();i++)
{
if(nums[i]>0)
vec.push_back(i+1);
}
return vec;
}
};
485. Max Consecutive Ones
class Solution {
public:
intfindMaxConsecutiveOnes(vector<int>& nums)
{
int max=0;
int count=0;
for(int i=0;i<nums.size();i++)
{
if(nums[i]==1)
{
count++;
if(count>max)
max=count;
}
else
{
count=0;
}
}
return max;
}
};