[蓝蓝计算机考研算法训练二期]-day24

91 阅读1分钟

35、从有序顺序表中删除所有其值重复的元素,使表中元素不重复

思路

从第二个元素开始遍历数组,len从1开始,如果有相同的元素len就记录相同元素的第二个元素的下标,比较每一个元素和前一个元素,如不相等将当前元素赋值到nums[len],同时len向前移一位,遍历完数组之后len之前的元素都是没有重复的了。

具体实现

public static int removeDuplicateElements(int[] nums) {
		int len=1;
		for(int i=1;i<nums.length;i++) {
			if(nums[i]!=nums[i-1]) {
				nums[len]=nums[i];
				len++;
			}
		}
		return len;
	}

36、将两个有序表合并成一个新的有序表

思路

采用逆向双指针,倒着将nums2中的数和nums1中前m个数逐个比较,将较大者放到nums1后面部分,如果nums2中的数多余m个,则最后再将nums2剩余的数逐个放到nums1剩余位置即可。

具体实现

    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int i=m-1,j=n-1,k=m+n-1;
        while(i>=0&&j>=0){
            if(nums1[i]>nums2[j]){
                nums1[k]=nums1[i];
                i--;
            }else{
                nums1[k]=nums2[j];
                j--;
            }
            k--;
        }
        while(j>=0){
            nums1[k]=nums2[j];
            j--;
            k--;
        }

    }