今日OJ练习题写的感觉比较成功的俩道题~二维网络迁移和找小镇法官

给你一个 m 行 n 列的二维网格 grid 和一个整数 k。你需要将 grid 迁移 k 次。

每次「迁移」操作将会引发下述活动:

位于 grid[i][j] 的元素将会移动到 grid[i][j + 1]。
位于 grid[i][n - 1] 的元素将会移动到 grid[i + 1][0]。
位于 grid[m - 1][n - 1] 的元素将会移动到 grid[0][0]。
请你返回 k 次迁移操作后最终得到的 二维网格。

详细点开链接查看:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shift-2d-grid
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思想:
建立一个一维数组长度为题中二维数组元素个数,然后依次遍历二维数组,讲二维数组第i个位置的值进行+k操作,然后放入我建好的一维数组当中,如果值大于一维数组长度,进行%操作。
最后遍历完二维数组之后将一维数组进行分割插入链表。
最后合成二维链表。

class Solution {
    public List<List<Integer>> shiftGrid(int[][] grid, int k) {
        int n = grid[0].length;
        int m = grid.length;
        int length = n * m;
        int[] nums = new int[length];
        for(int i = 0; i < m; i ++) {
            for( int j = i * n; j < i * n +n; j ++) {
                int index = j + k;
                index %= length;
                nums[index] = grid[i][j - i * n];
            }
        }
        List<List<Integer>> listList = new ArrayList<>();
        for(int i = 0; i < length; ) {
            List<Integer> list = new ArrayList<>();
            list.add(nums[i]);
            i ++;
            while(true) {
            if(i % n == 0) {
                listList.add(list);
                break;
            }
            list.add(nums[i]);
            i ++;
            }
        }
        return listList;
    }

}

**找小镇法官:

在一个小镇里,按从 1 到 N 标记了 N 个人。传言称,这些人中有一个是小镇上的秘密法官。
如果小镇的法官真的存在,那么:
小镇的法官不相信任何人。
每个人(除了小镇法官外)都信任小镇的法官。
只有一个人同时满足属性 1 和属性 2 。
给定数组 trust,该数组由信任对 trust[i] = [a, b] 组成,表示标记为 a 的人信任标记为 b 的人。
如果小镇存在秘密法官并且可以确定他的身份,请返回该法官的标记。否则,返回 -1。

示例 1:
输入:N = 2, trust = [[1,2]]
输出:2
示例 2:
输入:N = 3, trust = [[1,3],[2,3]]
输出:3
示例 3:
输入:N = 3, trust = [[1,3],[2,3],[3,1]]
输出:-1
示例 4:
输入:N = 3, trust = [[1,2],[2,3]]
输出:-1
示例 5:
输入:N = 4, trust = [[1,3],[1,4],[2,3],[2,4],[4,3]]
输出:3

提示:
1 <= N <= 1000
trust.length <= 10000
trust[i] 是完全不同的
trust[i][0] != trust[i][1]
1 <= trust[i][0], trust[i][1] <= N
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-the-town-judge
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思想:
这道题我也是想了很久才发现规律的,首先,法官是在每个一维数组0号下标里是不可出现的,而且从1~N人里没出现的法官数字有且只有一个,其次在当找到法官的数字后,在每个一维数组里1号下标为法官的数字的数组里0号下标的数值1到N除了法官的数字都必须出现一次。**

class Solution {
    public int findJudge(int N, int[][] trust) {
      List<Integer> judeg = new ArrayList<>();
        for(int i = 1; i <= N; i ++) {
            judeg.add(i);
        }
        for (int[] ints : trust) {
            judeg.remove((Integer) ints[0]);
        }
        if(judeg.size() != 1) {
            return -1;
        }
        int judegNum = judeg.get(0);
        int count = 0;
        for (int[] ints : trust) {
            if (ints[1] == judegNum) {
                count++;
            }
        }
        if(count == N - 1) {
            return judegNum;
        }
        return -1;
    }
}

猜你喜欢

转载自blog.csdn.net/Shangxingya/article/details/105544807