LeetCode刷题记录(数组篇)

1051. 高度检查器

题目链接:height-checker

题目描述:

学校在拍年度纪念照时,一般要求学生按照 非递减 的高度顺序排列。请你返回能让所有学生以 非递减 高度排列的最小必要移动人数。注意,当一组学生被选中时,他们之间可以以任何可能的方式重新排序,而未被选中的学生应该保持不动。

例:输入:heights = [1,1,4,2,1,3];输出:3

由于一开始忘记了数组的相关API,自己实现了冒泡排序,然后将排序后的数组与原数组进行比较,相同索引下数据不同的个数即为所求。

原始代码:

public class HeightChecker {
	public static void main(String[] args) {
		int[] heights = { 1, 1, 4, 2, 1, 3 };
		// 对原始数组排序,放入新数组,与原数组进行比较
		int[] arr = new int[heights.length];
		for (int i = 0; i < heights.length; i++) {
			arr[i] = heights[i];
		}
		bubbleSort(heights);
		int count = 0;
		for (int i = 0; i < heights.length; i++) {
				if (heights[i] != arr[i]) {
					count ++;
			}
		}
		System.out.println(count);

	}
	//冒泡排序
	static void bubbleSort(int[] heights) {
		for (int i = 0; i < heights.length - 1; i++) {
			for (int j = 0; j < heights.length - i - 1; j++) {
				if (heights[j] > heights[j + 1]) {
					int temp = heights[j];
					temp = heights[j];
					heights[j] = heights[j + 1];
					heights[j + 1] = temp;
				}
			}

		}
	}
}

在了解了相关API之后对其进行改进:

public class HeightChecker2 {
	public static void main(String[] args) {
		int[] heights = { 1, 1, 4, 2, 1, 3 };
                //Array.copyof(int[] arr, length),拷贝数组
		int[] temp = Arrays.copyOf(heights, heights.length);
                //使用array.sort()对其进行排序,默认升序
		Arrays.sort(temp);
		int count = 0;
		for (int i = 0; i < temp.length; i++) {
			if (temp[i]!=heights[i]) {
				count++;
			}
		}
		System.out.println(count);
	}
}

剑指 Offer 53 - II. 0~n-1中缺失的数字

 

题目描述:

一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。

例如:输入: [0,1,3] 输出: 2

容易想到直接遍历数组将数组元素和0~n数据进行比对,遇到不一致直接返回即可,遍历结束若全部一致则返回数组长度。

class Solution {
    public int missingNumber(int[] nums) {
		for (int i = 0; i < nums.length; i++) {
			if (nums[i]!=i) {
				return i;
			}
		}
		return nums.length;
    }
}

提交之后发现很多人指明这道题需要把所有条件利用上,该数组是默认有序的,所以数据量大的时候选择二分法更佳。

public static int missingNumber(int[] nums) {
		int i = 0, j = nums.length;
		while (i <= j) {
			int m = (i + j) / 2;
			if (nums[m] == m) {
				i = m + 1;
			} else {
				j = m - 1;
			}
		}
		return i;
	}

 

你可能感兴趣的:(LeetCode刷题记录(数组篇))