算法一: 合并两个有序数组
给你两个按 非递减顺序 排列的整数数组 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;
}
}`