LeetCode寒假刷题 Day07


前言

今天是寒假LeetCode刷题打卡的第七天,继续坚持、继续加油!也希望我的博文能够帮助到大家,若有疑问,可以随时私信Call我!

一、054 螺旋矩阵

1. 题目描述

题号:54
难度:中等
054 螺旋矩阵
给定一个包含 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]
示例 3:

输入:
[
[1]
]
输出: [1]
示例 4:

输入:
[
[2, 3, 4],
[5, 6, 7],
[8, 9, 10],
[11, 12, 13]
]
输出: [2,3,4,7,10,13,12,11,8,5,6,9]

2. 解题思路

因为前几天偶尔在看递归和回溯的例题,因此就趁热打铁,直接用函数递归的方法来实现。根据螺旋矩阵的特性,先扫描最外层一圈,然后缩小圈的大小,扫描稍微靠里面的一层那一圈的元素,直到扫描到最中间的元素(list中的元素个数与输入的matrix矩阵个数相等)时为止。

3. 代码实现

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> list=new ArrayList<Integer>();
        int i=matrix.length-1;
        int j=matrix[0].length-1;
        dfs(matrix,0,0,i,j,list);
        return list;
    }
    public void dfs(int [][]matrix,int a,int b,int i,int j,List<Integer> list)
    {
        list.add(matrix[a][b]);
        if(a==matrix.length-1-i&&b<j)
        {
            dfs(matrix,a,b+1,i,j,list);
        }
        else if(a<i&&b==j)
        {
            dfs(matrix,a+1,b,i,j,list);
        }
        else if(a==i&&b>matrix[0].length-j-1&&i!=0)
        {
            if(list.size()==matrix.length* matrix[0].length)
                return;
            dfs(matrix,a,b-1,i,j,list);
        }
        else if(b==matrix[0].length-j-1&&a> matrix.length-i&&j!=0)
        {
            if(list.size()==matrix.length* matrix[0].length)
                return;
            dfs(matrix,a-1,b,i,j,list);
        }
        else
        {
            --i;
            --j;
            if(list.size()==matrix.length* matrix[0].length)
                return;
            if(i>=0)
                dfs(matrix,matrix.length-i-1,matrix[0].length-j-1,i,j,list);
            else
                return;
        }

    }
}

二、059 螺旋矩阵 II

1. 题目描述

题号:59
难度:中等
059 螺旋矩阵 II
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

示例:

输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]

2. 解题思路

由于这几天有些事情很忙,所以我一天做不完三道题。因此我决定,没有做的题,先在打卡的时候首先做好未做题的标记,然后贴上LeetCode网站上的题解代码,等以后再思考并自己代码实现。

今天的未做题便是 059 螺旋矩阵 II 这一道,下面是LeetCode上的题解代码。

3. 代码实现

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] res = new int [n][n];
        int left = 0,up = 0;
        int right = n-1,down = n-1;
        int index = 1;
        while(true){
            for(int i=left;i<=right;i++)    res[up][i] = index++;
            if(++up>down)   break;
            for(int i=up;i<=down;i++)    res[i][right] = index++;
            if(--right<left)   break;
            for(int i=right;i>=left;i--)    res[down][i] = index++;
            if(--down<up)   break;
            for(int i=down;i>=up;i--)    res[i][left] = index++;
            if(++left>right)   break;
        }
        return res;
    }
}

三、061 旋转链表

1. 题目描述

题号:61
难度:中等
061 旋转链表
给定一个链表,旋转链表,将链表每个节点向右移动 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

2. 解题思路

由题可知,当k的个数小于链表中的总结点个数时,旋转后的结果为将链表最后面的k个元素提前到最前面。

当k的个数大于链表中的总节点个数时,最终旋转后的链表结果与k%count相等。因此,我想到利用这一特性,将k>count的情况转化为k<count的情况,这样就可以解决k>count的情况下的链表旋转问题。

3. 代码实现

class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        ListNode i=new ListNode(-1,head);
        head=i;
        int count=0;
        while(i.next!=null)
        {
            ++count;
            i=i.next;
        }
        if(count==0)
            return head.next;
        k=k%count;
        if(k==0)
            return head.next;
        i=head;
        for(int temp=0;temp<count-k;++temp)
        {
            i=i.next;
        }
        ListNode j=i.next;
        ListNode z=i.next;
        while(z.next!=null)
            z=z.next;
        i.next=null;
        z.next=head.next;
        head.next=j;
        return head.next;
    }
}

总结

以上就是今天 LeetCode寒假刷题 Day07 所做的三道题。若有任何疑问,欢迎私信或评论区留言鸭!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值