Array(6) -- Maximum Subarray,Rotate Image,Unique Paths II,Spiral Matrix I, II

Maximum Subarray

此题类似于求最大积的Maximum Subarray,基本思想是DP,maxHere表示包含该数的最大值。

    int maxSubArray(vector<int>& nums) {
        int maxHere = nums[0];
        int totalMax = maxHere;
        for(int i = 1; i < nums.size(); i++){
            maxHere = max(maxHere+nums[i], nums[i]);
            totalMax = max(totalMax, maxHere);
        }
        return totalMax;
    }


Rotate Image

You are given an n x n 2D matrix representing an image.

Rotate the image by 90 degrees (clockwise).

新的行 = 列; 新的列 = n-1-行。需要注意的点是i,j的循环范围,已经旋转过的不能再旋转。

    void rotate(vector<vector<int>>& matrix) {
        int v2move, v2replace, tmp3;
        int last_i, last_j;
        int n = matrix.size();
        float end = matrix.size();
        int start = 0;
        for(int i = 0; i < end; i++, end--, start++){
            for(int j = start; j < end - 1; j++){
                v2move = matrix[i][j];
                last_i = i; last_j = j;
                for(int k = 0; k < 4; k++){
                    v2replace = matrix[last_j][n-1-last_i];
                    matrix[last_j][n-1-last_i] = v2move;
                    v2move = v2replace;
                    tmp3 = last_i;
                    last_i = last_j;
                    last_j = n-1-tmp3;
                }
            }
        }
    }

Unique Paths II

Follow up for "Unique Paths":

Now consider if some obstacles are added to the grids. How many unique paths would there be?

An obstacle and empty space is marked as 1 and 0 respectively in the grid.

跟Unique Path I不同,这个无法通过组合的方法去计算,下面的解法多用了m+n的空间,避免了i-1>=0和j-1>=0的判断。

    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int m = obstacleGrid.size(), n = obstacleGrid[0].size();
        vector<vector<int> > dp(m + 1, vector<int> (n + 1, 0));
        dp[0][1] = 1;
        for (int i = 1; i <= m; i++)
            for (int j = 1; j <= n; j++)
                if (!obstacleGrid[i - 1][j - 1])
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
        return dp[m][n];
    } 


Spiral Matrix

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]

You should return [1,2,3,6,9,8,7,4,5].

按照spiral顺序添加元素,使用通过改变colCursor和rowCursor控制添加顺序。

    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> rst;
        if(matrix.size() < 1) return rst; 
        int upBound = -1, downBound = matrix.size();
        int leftBound = -1, rightBound = matrix[0].size();
        int rowCursor = 1, colCursor = 0;
        int i = 0, j = 0;
        int total = matrix.size() * matrix[0].size();
        while(rst.size() < total){
            while(j < rightBound && j > leftBound && i > upBound && i < downBound){
                rst.push_back(matrix[i][j]);
                i += colCursor;
                j += rowCursor;
            }
            if(j == rightBound){
                upBound++; j--; i++;
                colCursor = 1; rowCursor = 0;
            }
            else if(j == leftBound){
                downBound--; j++; i--;
                colCursor = -1; rowCursor = 0;
            }
            else if(i == upBound){
                leftBound++; i++; j++;
                colCursor = 0; rowCursor = 1;
            }
            else if(i == downBound){
                rightBound--; i--; j--;
                colCursor = 0; rowCursor = -1;
            }
        }
        return rst;
    }


更简洁的做法。通过语句的顺序控制添加顺序,通过判断边界是否越界决定循环。

    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        if (matrix.empty()) return {};
        int m = matrix.size(), n = matrix[0].size();
        vector<int> spiral(m * n);
        int u = 0, d = m - 1, l = 0, r = n - 1, k = 0;
        while (true) {
            // up
            for (int col = l; col <= r; col++) spiral[k++] = matrix[u][col];
            if (++u > d) break;
            // right
            for (int row = u; row <= d; row++) spiral[k++] = matrix[row][r];
            if (--r < l) break;
            // down
            for (int col = r; col >= l; col--) spiral[k++] = matrix[d][col];
            if (--d < u) break;
            // left
            for (int row = d; row >= u; row--) spiral[k++] = matrix[row][l];
            if (++l > r) break;
        }
        return spiral;
    }

Spiral Matrix II

Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.

Given n = 3,

You should return the following matrix:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]
思路和上面的题一样

    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> rst(n,vector<int>(n));
        int up = 0, down = n-1, left = 0, right = n-1;
        int count = 1;
        while(1){
            //up
            for(int col = left; col <= right; col++) rst[up][col] = count++;
            if(++up > down) break;
            
            //right
            for(int row = up; row <= down; row++) rst[row][right] = count++;
            if(--right < left) break;
            
            //down
            for(int col = right; col >= left; col--) rst[down][col] = count++;
            if(--down < up) break;
            
            //left
            for(int row = down; row >= up; row--) rst[row][left] = count++;
            if(++left > right) break;
        }
        return rst;
    }


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值