【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;
    }

}

原文地址:https://www.cnblogs.com/cutter-point/p/11193076.html

时间: 2024-10-08 02:43:57

【LEETCODE】57、数组分类,适中级别,题目:969、442、695的相关文章

LeetCode --- 57. Insert Interval

Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary). You may assume that the intervals were initially sorted according to their start times. Example 1: Given intervals [1,3],[6,9], insert and merge

LeetCode OJ平台上Maximum Subarray题目O(n)复杂度解决方案

原始题目如下,意为寻找数组和最大的子串,返回这个最大和即可. Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, given the array [?2,1,?3,4,?1,2,1,?5,4], the contiguous subarray [4,?1,2,1] has the largest sum = 6.

LeetCode OJ平台上Sort Colors题目算法探讨

原题如下,意思就是说无序数组(由0,1,2组成),一遍扫描,把数组整理成若干个0-若干个1-若干个2这样的序列. Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue. Here, we will use the integ

leetcode旋转数组查找 二分查找的变形

http://blog.csdn.net/pickless/article/details/9191075 Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). You are given a target value to search. If found in the array return it

LeetCode OJ平台上Maximum Subarray题目O(n)复杂度解决方式

原始题目例如以下,意为寻找数组和最大的子串,返回这个最大和就可以. Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, given the array [?2,1,?3,4,?1,2,1,?5,4], the contiguous subarray [4,?1,2,1] has the largest sum =

LeetCode:数组中的第K个最大元素【215】

LeetCode:数组中的第K个最大元素[215] 题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4 说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度. 题目分析 我们主要来学习一个新的集合类型--优先队列.优先队列作用是保证每次取

【LEETCODE】56、数组分类,适中级别,题目:62、63、1035

package y2019.Algorithm.array.medium; /** * @ClassName UniquePathsWithObstacles * @Description TODO 63. Unique Paths II * * A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). * The robot can only move eit

【LEETCODE】52、数组分类,简单级别,题目:717,661,746,628,643,849

package y2019.Algorithm.array; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.array * @ClassName: IsOneBitCharacter * @Author: xiaof * @Description: TODO 717. 1-bit and 2-bit Characters * We have two special characters. The first charac

【LeetCode】数组-6(561)-Array Partition I(比较抽象的题目)

题目描述:两句话发人深思啊.... Given an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1, b1), (a2, b2), ..., (an, bn) which makes sum of min(ai, bi) for all i from 1 to n as large as possible. 感觉题目的大致意思就是把数组分成很多个二元数组,对它