【LeetCode-面试经典150题-day1】

88.合并两个有序数组

题意:

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

请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 

【输入样例】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 nums1Index = m-1;
        int nums2Index = n-1;
        int curIndex = m + n -1;//指向nums1的最后
        while(curIndex >= 0){
            if(nums1Index < 0){
                //nums2数组h剩余是最小的
                nums1[curIndex--] = nums2[nums2Index--];
            }else if(nums2Index < 0){
                //nums1数组还有剩余
                nums1[curIndex--] = nums1[nums1Index--];
            }else if(nums1[nums1Index] > nums2[nums2Index]){
                //nums1的值大
                nums1[curIndex--] = nums1[nums1Index--];
            }else if(nums1[nums1Index] <= nums2[nums2Index]){
                //nums2的值大
                 nums1[curIndex--] = nums2[nums2Index--];
            }
            
        }
    }
}

时间: 击败了100.00%

内存: 击败了 99.10%

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        /*参考大佬的代码,写这个代码的时候,在思考先判断n>=0,那当nums2的数组都存储完毕之后,循环结束,剩下的nums1中的数据怎么办?
        后来才发现是num1剩下的数据都是在数组最前面,也只剩它们了,数组默认都有序了,不动它就好了,真的是被自己菜到的一天
        */
        int curIndex = m + n -1;
        m--;
        n--;
        while(n >= 0){
            while(m>=0 && nums1[m] > nums2[n]){
                //当输入的nums1还未空并且比当前值更大时,存nums1中的值
                nums1[curIndex--] = nums1[m--];
            }
            //其余情况都是存储nums2的值
            nums1[curIndex--] = nums2[n--];
        }
    }
}

时间: 击败了100.00%

内存: 击败了 59.47% 

27.移除元素

题意:

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

【输入样例】nums=[3,2,2,3],val=3

【输出样例】2,nums=[2,2]

解题思路:不使用额外的数组空间,O(1)额外空间原地修改数组。

1.引入一个临时变量temp,用于交换数组中两个元素时存储临时数据;

2.引入一个计数变量total,统计数组中共有多少个数据值等于val;

3.定义一个数组尾部指针j,指向数组最后一位;

3.遍历数组,遇到val值时,total++,并利用temp变量将num[i]与num[j]进行交换,注意交换后j--;

class Solution {
    public int removeElement(int[] nums, int val) {
        int temp;
        int total = 0;
        int j=nums.length - 1;
        for(int i=0;i<=j;i++){
            //这里i<=j是因为指针j后面全都是val的值
            if(nums[i]==val){
                temp = nums[i];
                nums[i--] = nums[j];//--是为了方式交换过来的num[j]==val,要再判断一次
                nums[j--] = temp;//j--,当前j存的是val
                total++;
            }
        }
        return nums.length - total;
        
    }
}

时间: 击败了100.00%

内存: 击败了 89.39% 

class Solution {
    public int removeElement(int[] nums, int val) {
        //继续附上学习的大佬的代码,直接进行覆盖
        int j = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != val) {
                nums[j++] = nums[i];
            }
        }
        return j;
    }
}

时间: 击败了100.00%

内存: 击败了 99.61% 

你可能感兴趣的:(LeetCode,算法,leetcode,面试)