代码随想录算法训练营第二天|977.有序数组的平方|209. 长度最小的子数组|59. 螺旋矩阵 II|1020. 飞地的数量

977.有序数组的平方

方法一

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> ans;
        for (int num: nums) {
            ans.push_back(num * num);
        }
        sort(ans.begin(), ans.end());
        return ans;
    }
};

方法二:开辟额外数组,利用两边的双指针缩进,比较大小填入新数组

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int n = nums.size();
        vector<int> ans(n);
        for (int i = 0, j = n - 1, pos = n - 1; i <= j;) {
            if (nums[i] * nums[i] > nums[j] * nums[j]) {
                ans[pos] = nums[i] * nums[i];
                ++i;
            }
            else {
                ans[pos] = nums[j] * nums[j];
                --j;
            }
            --pos;
        }
        return ans;
    }
};


209. 长度最小的子数组

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int slow=0;
        int fast=0;
        int count =0;
        int size=0;
        int maxsize=INT_MAX;
        for(slow,fast;fast<nums.size();fast++){
            count+=nums[fast];
            size++;
            while(count>=target){
                if(size<maxsize){
                    maxsize=size;
                }
                count-=nums[slow];
                size--;
                slow++;
            }
        }
        return maxsize!=INT_MAX?maxsize:0;
    }
};

59. 螺旋矩阵 II

最好自己在纸上把过程都模拟一下

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>>res(n,vector<int>(n,0));
        //loop圈数
        int loop=n/2;
        //起始位置
        int startx=0;
        int starty=0;
        //计数
        int count=1;
        //每圈中一行或者一列走的步长,每回合减2
        int index=n-1;
        while(loop--){
            
            for(int i=0;i<index;i++){
                res[starty][startx++]=count++;
            }
            for(int i=0;i<index;i++){
                res[starty++][startx]=count++;
            }
            for(int i=0;i<index;i++){
                res[starty][startx--]=count++;
            }
            for(int i=0;i<index;i++){
                res[starty--][startx]=count++;
            }
            startx++;
            starty++;
            index-=2;
        }
        //当n圈是奇数圈时给中心赋值
        if(n%2==1)res[starty][startx]=count;
        return res;
    }
};

1020. 飞地的数量

class Solution {
    int index[4][2]={-1, 0, 0, -1, 1, 0, 0, 1}; 
    int res=0;
    int coount=0;
    bool flag=false;//是否挨着边界
    void dfs(vector<vector<int>>& grid,vector<vector<bool>>&visited,int x,int y){     
        coount++;
        for(int i=0;i<4;i++){
            int startx=x+index[i][0];
            int starty=y+index[i][1];
            if(startx<0||startx>=grid.size()||starty<0||starty>=grid[0].size())
            {
                flag=true;
                continue;
            }
            if(grid[startx][starty]==1&&visited[startx][starty]==false){
                
                visited[startx][starty]=true;
                dfs(grid,visited,startx,starty);
            }

        }           
    }
public:
    int numEnclaves(vector<vector<int>>& grid) {
        vector<vector<bool>>visited(grid.size(),vector<bool>(grid[0].size(),false));
        for(int i=0;i<grid.size();i++){
            for(int j=0;j<grid[0].size();j++){
                if(grid[i][j]==1&&visited[i][j]==false){
                    flag=false;
                    visited[i][j]=true;
                    coount=0;
                    dfs(grid,visited,i,j);
                    if(flag==false)res+=coount;
                }
            }
        }
        return res;
    }
};

你可能感兴趣的:(算法,数据结构,C++)