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);
*/