zoukankan      html  css  js  c++  java
  • 【LEETCODE】57、数组分类,适中级别,题目:969、442、695

    package y2019.Algorithm.array.medium;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @ProjectName: cutter-point
     * @Package: y2019.Algorithm.array.medium
     * @ClassName: PancakeSort
     * @Author: xiaof
     * @Description: TODO 969. Pancake Sorting
     * Given an array A, we can perform a pancake flip: We choose some positive integer k <= A.length,
     * then reverse the order of the first k elements of A.
     * We want to perform zero or more pancake flips (doing them one after another in succession) to sort the array A.
     *
     * Return the k-values corresponding to a sequence of pancake flips that sort A.
     * Any valid answer that sorts the array within 10 * A.length flips will be judged as correct.
     *
     * Input: [3,2,4,1]
     * Output: [4,2,4,3]
     * Explanation:
     * We perform 4 pancake flips, with k values 4, 2, 4, and 3.
     * Starting state: A = [3, 2, 4, 1]
     * After 1st flip (k=4): A = [1, 4, 2, 3]
     * After 2nd flip (k=2): A = [4, 1, 2, 3]
     * After 3rd flip (k=4): A = [3, 2, 1, 4]
     * After 4th flip (k=3): A = [1, 2, 3, 4], which is sorted.
     *
     * 参考:https://blog.csdn.net/fuxuemingzhu/article/details/85937314
     *
     * @Date: 2019/7/16 8:57
     * @Version: 1.0
     */
    public class PancakeSort {
    
        public List<Integer> solution(int[] A) {
            //思路是这样的,就是每次吧最大的做一个翻转,移动到最前面,然后再翻转到最后面,这样每次都可以从数据中排除掉最大的那个
            //但是由于这个题的数字都是按照1~n的顺序给的值,那么就不需要每次都取最大值,只要取index索引就可以了
            List<Integer> res = new ArrayList<>();
            for(int i = A.length, x; i > 0; --i) {
                //寻找最大的位置
                for(x = 0; A[x] != i; ++x);
                //当x所在的索引跟当前应该的最大值相等的时候,也就是x指向了最大值的位置的-1位置,我们翻转两次
                //第一次吧值翻转到最前面,第二次翻转到最后面
                reverse(A, x);
                res.add(x + 1);
                //然后翻转到对应的位置
                reverse(A, i - 1);
                res.add(i);
            }
    
            return res;
        }
    
        private void reverse(int[] A, int k) {
            //翻转k位
            for(int i = 0, j = k; i < j; ++i,--j) {
                //前后交换
                int temp = A[i];
                A[i] = A[j];
                A[j] = temp;
            }
        }
    
        public static void main(String[] args) {
            int data[] = {3,2,4,1};
            PancakeSort fuc = new PancakeSort();
            System.out.println(fuc.solution(data));
            System.out.println();
        }
    
    }
    package y2019.Algorithm.array.medium;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Set;
    
    /**
     * @ProjectName: cutter-point
     * @Package: y2019.Algorithm.array.medium
     * @ClassName: FindDuplicates
     * @Author: xiaof
     * @Description: TODO 442. Find All Duplicates in an Array
     * Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.
     * Find all the elements that appear twice in this array.
     * Could you do it without extra space and in O(n) runtime?
     *
     * Input:
     * [4,3,2,7,8,2,3,1]
     * Output:
     * [2,3]
     *
     * 给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。
     * 找到所有出现两次的元素。
     * 你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?
     * @Date: 2019/7/16 9:00
     * @Version: 1.0
     */
    public class FindDuplicates {
    
        public List<Integer> solution(int[] nums) {
    
            //直接用set
            List<Integer> res = new ArrayList<>();
            if(nums == null || nums.length <= 0) {
                return res;
            }
            //受限还是排序
            Arrays.sort(nums);
            //遍历一次
            int preValue = nums[0];
            for(int i = 1; i < nums.length; ++i) {
                int curValue = nums[i];
                if(preValue == curValue) {
                    res.add(curValue);
                } else {
                    preValue = curValue;
                }
            }
    
            return res;
        }
    }
    package y2019.Algorithm.array.medium;
    
    /**
     * @ProjectName: cutter-point
     * @Package: y2019.Algorithm.array.medium
     * @ClassName: MaxAreaOfIsland
     * @Author: xiaof
     * @Description: TODO 695. Max Area of Island
     * Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land)
     * connected 4-directionally (horizontal or vertical.) You may assume all four edges of the grid are surrounded by water.
     *Find the maximum area of an island in the given 2D array. (If there is no island, the maximum area is 0.)
     *
     * [[0,0,1,0,0,0,0,1,0,0,0,0,0],
     *  [0,0,0,0,0,0,0,1,1,1,0,0,0],
     *  [0,1,1,0,1,0,0,0,0,0,0,0,0],
     *  [0,1,0,0,1,1,0,0,1,0,1,0,0],
     *  [0,1,0,0,1,1,0,0,1,1,1,0,0],
     *  [0,0,0,0,0,0,0,0,0,0,1,0,0],
     *  [0,0,0,0,0,0,0,1,1,1,0,0,0],
     *  [0,0,0,0,0,0,0,1,1,0,0,0,0]]
     * Given the above grid, return 6. Note the answer is not 11, because the island must be connected 4-directionally.
     *
     * 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。
     * 找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。)
     * 来源:力扣(LeetCode)
     * 链接:https://leetcode-cn.com/problems/max-area-of-island
     * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
     *
     * @Date: 2019/7/16 9:00
     * @Version: 1.0
     */
    public class MaxAreaOfIsland {
    
        public int solution(int[][] grid) {
            //寻找聚集度最高的和,遍历所有的岛屿,然后对附近的所有1求和,每次求和探索四个位置的和,上下左右
            int maxIsland = 0;
            for(int i = 0; i < grid.length; ++i) {
                for(int j = 0; j < grid[i].length; ++j) {
                    //求出最大的岛屿
                    maxIsland = Math.max(maxIsland, areaOfIsLand(grid, i, j));
                }
            }
            return maxIsland;
        }
    
        private int areaOfIsLand(int[][] grid, int x, int y) {
            if(x >= 0 && x < grid.length && y >=0 && y < grid[x].length && grid[x][y] == 1) {
                //设置标记
                grid[x][y] &= 0;
                return 1 + areaOfIsLand(grid, x - 1, y) + areaOfIsLand(grid, x + 1, y) + areaOfIsLand(grid, x, y - 1) + areaOfIsLand(grid, x, y + 1);
            }
    
            return 0;
        }
    
    
    
    }
  • 相关阅读:
    配置vCenter Server Appliance 6.7
    部署vCenter Server Appliance 6.7
    罗克韦尔 Allen-Bradley MicroLogix 1400 查看、设置IP
    centos7 部署 docker compose
    centos7 部署 docker ce
    docker 定时清理none镜像
    [CLR via C#]5.1 基元类型
    [CLR via C#]4. 类型基础及类型、对象、栈和堆运行时的相互联系
    [CLR via C#]1.6 Framework类库~1.9与非托管代码的互操作性
    [CLR via C#]1.5 本地代码生成器:NGen.exe
  • 原文地址:https://www.cnblogs.com/cutter-point/p/11193076.html
Copyright © 2011-2022 走看看