实现 pow(x, n) ,即计算 x 的 n 次幂函数。
示例 1:
输入: 2.00000, 10
输出: 1024.00000
示例 2:
输入: 2.10000, 3
输出: 9.26100
示例 3:
输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
说明:
-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。
class Solution {//超时:pow(2,-2147483648) 原因在于INT_MIN转为整数越界
public:
double myPow(double x, int n) {
if(x==1.0)return x;
if(n==0)return 1;
bool isMinus=n<0?true:false;
n=abs(n);
double res=1;
while(n){
res*=((n&1)==1?x:1);//n的二进制表示,第i位为1,则结果乘以x^(i+1)
x=x*x;
n>>=1;
}
return isMinus?1/res:res;
}
};
class Solution {//迭代
public:
double myPow(double x, int n) {
if(x==1.0)return x;
if(n==0)return 1;
bool isMinus=n<0?true:false;
long long N=n;//正确解法
N=abs(N);
double res=1;
while(N){
res*=((N&1)==1?x:1);
x=x*x;
N>>=1;
}
return isMinus?1/res:res;
}
};
class Solution {
public:
double myPow(double x, int n) {
if(x==1.0)return x;
if(n==0)return 1;
long long N=n;
return N<0?1/helper(x,-N):helper(x,N);
}
double helper(double x,long long N){
if(N==0)return 1.0;
double res=helper(x,N>>1);
return N%2==0?res*res:res*res*x;//递归/二分/分支
}
};
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int m=matrix.size();
if(m==0)return {};
int n=matrix[0].size();
if(n==0)return {};
vector<vector<bool>>visited(m,vector<bool>(n,false));//遍历过标志
//vector<bitset<n>>visited(m);初始化有问题
vector<int>res;
int size=m*n;
visited[0][0]=1;
res.push_back(matrix[0][0]);
for(int x=-1,y=0;;){//规规矩矩循环遍历:向右,向下,向左,向上
for(++x,++y;y<n&&visited[x][y]==0;++y)
visited[x][y]=1,res.push_back(matrix[x][y]);
if(res.size()==size)break;
for(--y,++x;x<m&&visited[x][y]==0;++x)
visited[x][y]=1,res.push_back(matrix[x][y]);
if(res.size()==size)break;
for(--x,--y;y>=0&&visited[x][y]==0;--y)
visited[x][y]=1,res.push_back(matrix[x][y]);
if(res.size()==size)break;
for(--x,++y;visited[x][y]==0;--x)
visited[x][y]=1,res.push_back(matrix[x][y]);
if(res.size()==size)break;
}
return res;
}
};
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int m=matrix.size();
if(m==0)return {};
int n=matrix[0].size();
if(n==0)return {};
vector<int>res;
int size=m*n;
int left=-1,right=n-1,up=0,down=m-1;//利用上下左右边界取代visited数组
while(true){
for(int i=++left;i<=right;++i)
res.push_back(matrix[up][i]);
if(res.size()==size)break;
for(int i=++up;i<=down;++i)
res.push_back(matrix[i][right]);
if(res.size()==size)break;
for(int i=--right;i>=left;--i)
res.push_back(matrix[down][i]);
if(res.size()==size)break;
for(int i=--down;i>=up;--i)
res.push_back(matrix[i][left]);
if(res.size()==size)break;
}
return res;
}
};
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>>res(n,vector<int>(n));
int size=n*n;
int left=-1,right=n-1,up=0,down=n-1;
for(int k=1;;){
for(int i=++left;i<=right;++i)
res[up][i]=k++;
if(k>size)break;
for(int i=++up;i<=down;++i)
res[i][right]=k++;
if(k>size)break;
for(int i=--right;i>=left;--i)
res[down][i]=k++;
if(k>size)break;
for(int i=--down;i>=up;--i)
res[i][left]=k++;
if(k>size)break;
}
return res;
}
};
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入: 1->2->3->4->5->NULL, k = 2
输出: 4->5->1->2->3->NULL
解释:
向右旋转 1 步: 5->1->2->3->4->NULL
向右旋转 2 步: 4->5->1->2->3->NULL
示例 2:
输入: 0->1->2->NULL, k = 4
输出: 2->0->1->NULL
解释:
向右旋转 1 步: 2->0->1->NULL
向右旋转 2 步: 1->2->0->NULL
向右旋转 3 步: 0->1->2->NULL
向右旋转 4 步: 2->0->1->NULL
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if(!head||!head->next)return head;
int size=1;
ListNode *end=head;
while(end->next){//得尾节点
end=end->next;
++size;
}
int pos=size-(k%=size);
if(k==0)return head;
ListNode *first=head,*res=nullptr;
for(int i=1;i<pos;++i)//得中间操作节点
first=first->next;
res=first->next;//拼接
end->next=head;
first->next=nullptr;
return res;
}
};