力扣刷题攻略:数组篇

来源:力扣刷题攻略

453最小移动次数使元组相等

每次操作既可以理解为使 n−1 个元素增加 1,也可以理解使 1 个元素减少 1。显然,后者更利于我们的计算。

但此题我采用了一种很神奇的写法也能通过,如下:

class Solution {
public:
    int minMoves(vector<int>& nums) {
     sort(nums.begin(),nums.end());
     int sum=0;  int m=nums.back();
     for(int i=nums.size()-2,j=1;i>=0;i--,j++)
     {
         sum+=j*(m-nums[i]);
         m=nums[i];
     }
return sum;
    }
};

665非递减数列

这个题很有意思,我们要遍历一遍数组,只有前一个比后一个大就要改变。

但是该如何变呢?

假设当前指针为i,nums[i-1]>nums[i],此时要改变数组,

若nums[i-2]>nums[i],那么就要改变nums[i]为nums[i-1]

若nums[i-2]<nums[i],那么改变nums[i-1]为nums[i],

考虑指针是否越界,i从1开始,i-2越界,若此时进入if判断说明nums[i-1]>nums[i],只需要改变nums[i-1]即可,归为第二种情况。

用flag判断改变了多少次

class Solution {
public:
    bool checkPossibility(vector<int>& nums) {
     int  flag=1;
for(int i=1;i<nums.size();i++)
     {
           if(nums[i-1]>nums[i])
           {
               if(i-2>=0 and nums[i-2]>nums[i] )
               {
                nums[i]=nums[i-1];
                flag--;
               }
               else 
               {
                nums[i-1]=nums[i];
                flag--;
               }
           }
           

     }
    
     if(flag>=0)
     return 1;
     else return 0;
    }
};

283. 移动零

用两个指针扫描即可,i从头扫,j扫下一个不为0的位置,直到j扫到头为止

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
       for(int i=0,j=0;j<nums.size();i++,j++)
       {
        if(nums[i]==0)
        {
            while( j<nums.size() and nums[j]==0 )
            j++;
           if (j<nums.size() )swap(nums[i],nums[j]);
        }
       }
    }
};

189. 轮转数组 

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        k=k%nums.size();
  reverse(nums.begin(),nums.end());
  reverse(nums.begin(),nums.begin()+k);
reverse(nums.begin()+k,nums.end());
    }
};

41. 缺失的第一个正数

先让数组有序,然后从1开始找是否在数组里有,没有就返回,注意边界条件

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
      sort(nums.begin(),nums.end());
      
    for(int i=1;;i++)
    {
        if(i>nums.back() or *lower_bound(nums.begin(),nums.end(),i)!=i )
        return i;
    }

    }
};

495提莫攻击

用一个数组存储,用前缀和计算一下,然后遍历

class Solution {
public:
    int findPoisonedDuration(vector<int>& timeSeries, int duration) {
         const int M=1e7; 
          vector<int> s(M,0);
          for(int i=0;i<timeSeries.size();i++)
          {
            int t=timeSeries[i];
            s[t]++;
            s[t+duration]--;
          }
         int ant=0,a=0;
          for(int i=0;i<M;i++)
          {
            a+=s[i];
            if(a)
            {
                ant++;
            }
            
          }
return ant;
    }
};

419棋盘上的战舰 

这题是说每一大矩形块内战船形成战舰,找左上角的头船,当它左和上没有船时即为舰队

class Solution {
public:
    int countBattleships(vector<vector<char>>& board) {
     int ant=0;
     for(int i=0;i<board.size();i++)
     for(int j=0;j<board[0].size();j++)
     {
         if(board[i][j]=='X' and (i==0 ||board[i-1][j]=='.') and (j==0 || board[i][j-1]=='.'))
         ant++;
        
     }
    
    
    return ant; 
    }
};

498对角线遍历

class Solution {
public:
    vector<int> findDiagonalOrder(vector<vector<int>>& mat) {
     int m=mat.size();int n=mat[0].size();
        vector<int> ans;
        for(int i=0;i<m+n-1;i++)
        {
            if(i%2)
            {
                int x=i<n?0:i-n+1;
                int y=i<n?i:n-1;
                while(x<m and y>=0)
                {
                    ans.push_back(mat[x][y]);
                    x++;
                    y--;
                }
            }
            else
            {
                int x=i<m?i:m-1;
                int y=i<m?0:i-m+1;
                while(x>=0 and y<n)
                {
                    ans.push_back(mat[x][y]);
                    x--;
                    y++;
                }
            }
        }
     return ans;
         }
};

73 矩阵置0

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int m = matrix.size();
        int n = matrix[0].size();
        int row1 = 0, col1 = 0;
        for (int i = 0; i < m; i++)
            if (matrix[i][0] == 0)
                row1 = 1;
        for (int i = 0; i < n; i++)
            if (matrix[0][i] == 0)
                col1 = 1;

        for (int i = 1; i < m; i++)
            for (int j = 1; j < n; j++)
                if (matrix[i][j] == 0) {
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }

        for (int i = 1; i < m; i++)
            for (int j = 1; j < n; j++)
                if (matrix[i][0] == 0 || matrix[0][j] == 0) {
                    matrix[i][j] = 0;
                }

        if (row1) {
            for (int i = 0; i < m; i++)
                matrix[i][0] = 0;
        }
        if (col1) {
            for (int j = 0; j < n; j++)
                matrix[0][j] = 0;
        }
    }
};

303 区域和检索

class NumArray {
    vector<int> s;
public:
    NumArray(vector<int>& nums) {
        s.resize(nums.size()+1);
        for(int i=0;i<nums.size();i++)
           s[i+1]=s[i]+nums[i];
    }
    
    int sumRange(int left, int right) {
        return s[right+1]-s[left];
    }
};

/**
 * Your NumArray object will be instantiated and called as such:
 * NumArray* obj = new NumArray(nums);
 * int param_1 = obj->sumRange(left,right);
 */

  • 17
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值