数组中的算法问题

58 阅读2分钟

算法一: 合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

示例:输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3输出:[1,2,2,3,5,6]

`class Solution {

    public void merge(int[] nums1, int m, int[] nums2, int n) {

        int p1 = m - 1; // 标记nums1中指针的位置

        int p2 = n - 1; // 标记nums2中指针的位置

        int curr = m + n - 1; // 标记新数组填充元素的指针的位置

        while(p2 >= 0){

            if(p1 >= 0 && nums1[p1] > nums2[p2]){

                nums1[curr--] = nums1[p1--];

            }else{

                nums1[curr--] = nums2[p2--];

            }

        }

    }

}`

算法二: 颜色分类

给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

示例:输入:nums = [2,0,2,1,1,0]输出:[0,0,1,1,2,2]

`class Solution {

    public void sortColors(int[] nums) {

        int green = 0;

        int red = 0;

        int purple = nums.length - 1;

        while(green <= purple){

            int temp = nums[green];

            if(temp == 0){

                swap(nums,green++,red++);

            }else if(temp == 1){

                green++;

            }else{

                swap(nums,green,purple--);

            }

        }

    }

    private void swap(int[] nums,int i,int j){

        int temp = nums[i];

        nums[i] = nums[j];

        nums[j] = temp;

    }

}`

算法三: 部分排序

给定一个整数数组,编写一个函数,找出索引m和n,只要将索引区间[m,n]的元素排好序,整个数组就是有序的。注意:n-m尽量最小,也就是说,找出符合条件的最短序列。函数返回值为[m,n],若不存在这样的m和n(例如整个数组是有序的),请返回[-1,-1]。

输入: [1,2,4,7,10,11,7,12,6,7,16,18,19]输出: [3,9]

`class Solution {

    public int[] subSort(int[] array) {

        int length = array.length;

        if(length == 0) return new int[]{-1,-1};

        int max = array[0];

        int right = -1;

        for(int i = 1; i < length;i++){

            if(array[i] >= max){

                max = array[i];

            }else{

                right = i;

            }

        }

        int min = array[length - 1];

        int left = -1;

        for(int i = length - 2; i >= 0;i--){

            if(array[i] <= min){

                min = array[i];

            }else{

                left = i;

            }

        }

        return new int[]{left,right};

    }

}`

算法四: 有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

输入:nums = [-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为 [16,1,0,9,100]排序后,数组变为 [0,1,9,16,100]

`class Solution {

    public int[] sortedSquares(int[] nums) {

        int n = nums.length;

        int[] ans = new int[n];

        int p1 = 0;

        int p2 = n - 1;

        int curr = n - 1;

        while(p1 <= curr){

            int a = nums[p1] * nums[p1];

            int b = nums[curr] * nums[curr];

            if(a < b){

                ans[p2--] = b;

                curr--;

            }else{

                ans[p2--] = a;

                p1++;

            }

        }

        return ans;

    }

}`