50Pow(x, n);54螺旋矩阵;59螺旋矩阵 II;61旋转链表

实现 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;
    }
};

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值