构建新数组
leetcode offer66 构建乘积数组
class Solution {
public:
vector<int> constructArr(vector<int>& a) {
int n=a.size();
vector<int>ans(n);
vector<int>left(n,1);
vector<int>right(n,1);
for(int i=1;i<n;i++){
left[i]=left[i-1]*a[i-1];
}
for(int i=n-2;i>=0;i--){
right[i]=right[i+1]*a[i+1];
}
for(int i=0;i<n;i++){
ans[i]=left[i]*right[i];
}
return ans;
}
};
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
int l=0,r=nums.size()-1;
while(l<r){
if(nums[l]%2==0&&nums[r]%2!=0){
swap(nums[l],nums[r]);
}
if(nums[l]%2==0&&nums[r]%2==0){
r--;
}
if(nums[l]%2!=0&&nums[r]%2!=0){
l++;
}
if(nums[l]%2!=0&&nums[r]%2==0){
l++;
r--;
}
}
return nums;
}
};
数组查找
剑指 Offer 39. 数组中出现次数超过一半的数字
class Solution {
public:
int majorityElement(vector<int>& nums) {
int n=nums.size();
int pre=nums[0];
int cnt=1;
for(int i=1;i<nums.size();i++){
if(pre==nums[i]){
cnt++;
}else{
cnt--;
if(cnt==0){
pre=nums[i];
cnt=1;
}
}
}
return pre;
}
};
剑指 Offer 40. 最小的k个数
这里用最小堆来做
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
vector<int>vec(k, 0);
if (k == 0) {
return vec;
}
priority_queue<int> Q;
for (int i = 0; i < k; ++i) {
Q.push(arr[i]);
}
for (int i = k; i < (int)arr.size(); ++i) {
if (Q.top() > arr[i]) {
Q.pop();
Q.push(arr[i]);
}
}
for (int i = 0; i < k; ++i) {
vec[i] = Q.top();
Q.pop();
}
return vec;
}
};
剑指 Offer 53 - I. 在排序数组中查找数字 I
class Solution {
public:
int search(vector<int>& nums, int target) {
if(nums.size()==0) return 0;
int l=0,r=nums.size()-1;
if(target<nums[l]||target>nums[r])return 0;
int l1=l,r1=r;
while(l<r){
int mid=(l+r)/2;
if(nums[mid]>=target){
r=mid;
}else{
l=mid+1;
}
}
if(nums[l]!=target) return 0;
int t=1;
for(int i=l+1;i<=nums.size()-1;i++){
if(nums[i]!=nums[l]) break;
t++;
}
return t;
}
};
剑指 Offer 53 - II. 0~n-1中缺失的数字
class Solution {
public:
int missingNumber(vector<int>& nums) {
int i=0,j=nums.size()-1;
while(i<=j){
int mid=(i+j)>>1;
if(nums[mid]==mid) i=mid+1;
else{
j=mid-1;
}
}
return i;
}
};
class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
int i=matrix.size()-1,j=0;
while(i>=0&&j<matrix[0].size()){
if(matrix[i][j]==target) return true;
if(matrix[i][j]<target)j++;
else{
i--;
}
}
return false;
}
};
数组中出现的次数:
leetcode56
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
class Solution {
public:
vector<int> singleNumbers(vector<int>& nums) {
int ret=0;
for(int x:nums){
ret^=x;
}
int t=1;
while((ret&t)==0){
t<<=1;
}
int a=0,b=0;
for(int x:nums){
if(t&x){
a^=x;
}else{
b^=x;
}
}
return vector<int>{a,b};
}
};
leetcode 56-II
在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int n = nums.size();
sort(nums.begin(), nums.end());
if (nums[0] != nums[1]) return nums[0];
if (nums[n - 2] != nums[n - 1]) return nums[n - 1];
for (int i = 1;i < n;i++){
if (nums[i] != nums[i-1] && nums[i] != nums[i+1])
return nums[i];
}
return 0;
}
};
剑指 Offer 03. 数组中重复的数字
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
for(int i=0;i<nums.size();i++){
while(nums[i]!=i){
if(nums[i]==nums[nums[i]]){
return nums[i];
}else{
swap(nums[i],nums[nums[i]]);
}
}
}
return 0;
}
};
打印特殊数组:
剑指 Offer 17. 打印从1到最大的n位数
class Solution {
public:
vector<int>ans;
int pos=0;
vector<int>printNumbers(int n){
string s="0123456789";
string str="";
dfs(s,str,n);
return ans;
}
void dfs(string &s,string &str,int k){
if(str.length()==k){
if(pos==0){pos=1;return ;}
ans.push_back(atoi(str.c_str()));
return ;
}
for(int i=0;i<s.length();i++){
str+=s[i];
dfs(s,str,k);
str.pop_back();
}
}
};
剑指 Offer 29. 顺时针打印矩阵
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if (matrix.size() == 0 || matrix[0].size() == 0) {
return {};
}
int n=matrix.size();
int m=matrix[0].size();
int x=0,y=0;
vector<int>vec;
while(2*x<n&&2*y<m){
for(int i=y;i<m-y;i++){
vec.push_back(matrix[x][i]);
}
for(int i=x+1;i<n-x;i++){
vec.push_back(matrix[i][m-y-1]);
}
if(2*x+1<n){
for(int i=m-y-2;i>=y;i--){
vec.push_back(matrix[n-x-1][i]);
}
}
if(2*y+1<m){
for(int i=n-x-2;i>x;i--){
vec.push_back(matrix[i][x]);
}
}
x++;
y++;
}
return vec;
}
};
剑指offer51 数组中的逆序对
class Solution {
public:
int reversePairs(vector<int>& nums) {
vector<int> tmp(nums.size());
return mergeSort(0, nums.size() - 1, nums, tmp);
}
private:
int mergeSort(int l, int r, vector<int>& nums, vector<int>& tmp) {
if(l>=r)return 0;
int mid=(l+r)/2;
int res=mergeSort(l,mid,nums,tmp)+mergeSort(mid+1,r,nums,tmp);
int k=l,j=mid+1;
for(int i=l;i<=r;i++){
tmp[i]=nums[i];
}
for(int i=l;i<=r;i++){
if(k==mid+1){
nums[i]=tmp[j++];
}else if(j==r+1||tmp[k]<=tmp[j]){
nums[i]=tmp[k++];
}else{
nums[i]=tmp[j++];
res+=mid-k+1;
}
}
return res;
}
};
剑指 Offer 61. 扑克牌中的顺子
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。
class Solution {
public:
bool isStraight(vector<int>& nums) {
sort(nums.begin(),nums.end());
int count0=0;
for(int i=0;i<nums.size();++i)
{
if(nums[i]==0)
++count0;
else if(i!=0)
{
if(nums[i]==nums[i-1])
return false;
}
}
return nums.back()-nums[count0]<5;
}
};