动态数组编程题

1.力扣54 螺旋矩阵
在这里插入图片描述
通过找规律我们可以发现,顺时针螺旋出来的顺序就是要从数字“1”开始走,向右走到“3”,然后向下走到“9”,再向左走到“7”,再向上走到“4”,再向右走到“5”。这样走一圈,就完成了顺时针螺旋顺序。
我们再找规律,向右是横坐标不变,纵坐标+1。向下是纵坐标不变,横坐标+1。向左是横坐标不变 ,纵坐标-1。向上是纵坐标不变,横坐标-1。这样我们就分析出了所有变化坐标的规律。
我们可以用数字来表示这些规律。我们把最开始的位置设置为0,0 ;横坐标:int【】 delx={0,1,0,-1} 纵坐标:int 【】dely={1,0,-1,0}
定义一个变量来表示方向。然后把方向这两个坐标里,看是哪种情况。

代码如下:

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        ArrayList<Integer> list= new ArrayList<Integer>();
        if(matrix==null||matrix.length==0||matrix[0].length==0){
            return list;
        }
        int x=0;
        int y=0;
        int r=matrix.length;
        int c=matrix[0].length;
        boolean[][] visited=new boolean[r][c];	//判断是否走过
        int[] delx={0,1,0,-1};
        int[] dely={1,0,-1,0};
        int dir=0;		//方向
        for(int i =0;i<r*c;i++){
            list.add(matrix[x][y]);
            visited[x][y]=true;		//走过的位置
            int nx=x+delx[dir];
            int ny=y+dely[dir];
            if(nx>=0&&nx<r&&ny>=0&&ny<c&&!visited[nx][ny]){	//同一方向
                x=nx;
                y=ny;
            }else{	//换方向
                dir=(dir+1)%4;//从0开始,代表的是数组的四种情况,对4取余判断方向
                x+=delx[dir];
                y+=dely[dir];
            }
        }
        return list;
    }
}

2.力扣209 长度最小的子数组
在这里插入图片描述
题目意思很明显,就是让我们找到数组中相加和为目标数的连续数字,且长度必须为最小的。
这里我们的思路应该采用滑窗机制,给数组设置两个指针,定义一个长度。
如图:
在这里插入图片描述
先移动下面的j指针,然后加上j指针对应的数值,跟目标数比较,小于就j++,大于就i–。
让长度等于最小的子数组。最后返回子数组长度即可。

代码如下:

 public int minSubArrayLen(int s, int[] nums) {
        if(nums==null||nums.length==0){
            return 0;
        }
        int i=0;
        int len=0;
        int sum=0;
        for(int j=0;j<nums.length;j++){
            sum+=nums[j];	//先移动j指针,然后加上j指针对应的数值
            while(sum>=s){
                len=len==0?j-i+1:Math.min(len,j-i+1);//先判断是否是0,是0为j-i+1,不是则取最短的len:j-i+1.
                sum-=nums[i++];	//i指针前移,减去前面的数值
            }
        }
        return len;	//返回最短连续子数组的长度
    }

3.力扣240 搜索二维矩阵Ⅱ
在这里插入图片描述
我们可以很明显的发现这个二维矩阵数字的排列是有规律的。从左到右是升序,从上到下是升序。那我们搜索这个目标值就可以利用这个规律。
如图:
在这里插入图片描述
固定寻找的第一个位置,就是数字“18”所在的位置,然后比它大就向右边走,比它小就向上走。这样时间复杂度就是O(m+n)。

代码如下:

public boolean searchMatrix(int[][] matrix, int target) {
        if(matrix==null||matrix.length==0||matrix[0].length==0){
            return false;
        }
        int row=matrix.length;	//定义行
        int col=matrix[0].length;	//定义列
        int x=row-1;		//起始行的位置
        int y=0;			//起始列的位置
        while(true){
            if(x<0||y>=col){		//行或者列超出范围
                return false;
            }
            if(matrix[x][y]<target){	//当前值小于目标值,朝右走 列加1
                y++;
            }else if(matrix[x][y]>target){	//当前值大于目标值 朝左走 行减1
                x--;
            }else{
                return true;	//正好就返回true 表示找到
            }
        }
    } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值