283.LeetCode Move Zeros
1、创建辅助数组
class Solution {public void moveZeroes(int[] nums) {int [] newnums=new int[nums.length];int k=0;for(int i=0;i<nums.length;i++){if(nums[i]!=0){newnums[k++]=nums[i];}}for(int i=0;i<nums.length;i++){nums[i]=newnums[i];}}}
2、直接在原来的数组上进行操作
class Solution {public void moveZeroes(int[] nums) {int k=0;for(int i=0;i<nums.length;i++){if(nums[i]!=0){nums[k++]=nums[i];}for(int i=k;i<nums.length;i++){nums[i]=0;}}}
3、进行元素的交换
class Solution {public void moveZeroes(int[] nums) {int k=0;for(int i=0;i<nums.length;i++){int temp=0;if(nums[i]!=0){temp=nums[i];nums[i]=nums[k];nums[k]=temp;k++;}}}}
26. 删除排序数组中的重复项
class Solution {public int removeDuplicates(int[] nums) {int k = 1;for (int i = 1; i < nums.length; i++) {if (nums[i] != nums[i-1]) {nums[k]=nums[i];k++;}}return k;}}
基本思路: 1、遍历数组,当出现与前一个值不相等的情况时,进行k++操作以及数组赋值操作 2、关键点:在于处理时不出现角标越界的情况出现,我这里是默认不修改第一个值。 3、也可以通过while在操作,不使用for循环
27.移除元素
class Solution {public int removeElement(int[] nums, int val) {if (nums==null||nums.length==0){return 0;}int j=0;for (int i=0;i<nums.length;i++){if (nums[i]!=val){nums[j]=nums[i];j++;}}return j;}}
基本思路:此题思路与上一题基本一致,用两个变量遍历数组,不等于的时候就赋值。
80.删除排序数组中的重复项2
| 题目描述:给定一个增序排列数组 nums ,你需要在 原地 删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。(不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。) |
|---|
class Solution {public int removeDuplicates(int[] nums) {int k=1;int counts=1;for(int i=1;i<nums.length;i++){if(nums[i]!=nums[i-1]){nums[k++]=nums[i];counts=1;}else if(nums[i]==nums[i-1]&&counts<2){counts++;nums[k++]=nums[i]; //起始出错原因在于此处我虽然移动了看k,但是并未交换元素。}}return k;}}
| 题解思路: 1、使用两个指针,i是遍历指针,指向当前遍历的元素;j指向下一个要覆盖元素的位置。 2、同样,我们使用count记录当前数字出现的次数。count的最小计数始终为1,至少出现1次。 3、为我们从索引1开始一次处理一个数组元素。 4、若当前元素与前一个元素相同,即nums[i]=nums[i-1],则count++。若count>2,则说明遇到了多余的重复项。这种情况下只移动i,而不移动 j。 5、若 count <=2,则我们将 i 所指向的元素移动到 j 位置,并同时增加 i 和 j。 6、若当前元素与前一个元素不相同,即 nums[i] != nums[i - 1],说明遇到了新元素,则我们更新count=1;并且将该元素移动到j位置,同时增加 i 和 j。 7、当遍历完成,则返回 j 。 |
|---|
75.颜色分类+
给定一个有n个元素的数组,数组中元素的取值只有0,1,2三种可能。为这个数组排序。
解决方法1:计数排序,统计0,1,2三个元素的个数。
class Solution {public void sortColors(int[] nums) {int[] count=new int[3];for(int i=0;i<nums.length;i++){count[nums[i]]++;}int index=0;for(int i=0;i<count[0];i++){nums[index++]=0;}for(int i=0;i<count[1];i++){nums[index++]=1;}for(int i=0;i<count[2];i++){nums[index++]=2;}}}
解决方法2:三路快排思想
遍历元素,判断元素应该存储在哪一个区间中,然后进行移动下标、赋值元素的操作
class Solution {public void sortColors(int[] nums) {int n=nums.length;int l=0,index=0,r=n-1; //l和r代表了两个边界条件while (index<=r){ //importmentif(nums[index]==0){swap(nums,l,index);l++;index++;}else if(nums[index]==1){index++;}else {swap(nums,index,r);r--;}}}private void swap(int[] nums,int i,int j){int temp=nums[i];nums[i]=nums[j];nums[j]=temp;}}
注意遍历的截止条件
解决方法3:遍历赋值
class Solution {public void sortColors(int[] nums) {int num0 = 0;int num1 = 0;int num2 = 0;for (int i = 0; i < nums.length; i++) {if (nums[i] == 0) {num2++;num1++;nums[num0++] = 0;} else if (nums[i] == 1) {num2++;nums[num1++] = 1;} else {nums[num2++] = 2;}}}}
88. 合并两个有序数组
//给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int ai = m + n - 1;int mi = m - 1;int ni = n - 1;while (ni >= 0) {if (mi >= 0 && nums1[mi] > nums2[ni]) {nums1[ai--] = nums1[mi--];} else {nums1[ai--] = nums2[ni--];}}}}
| 题解思路:(倒序处理) 1、题目给出了每个数组的实际有效长度,所以不要被后面的0所迷惑 2、数组1的有效长度为m,数组2的有效长度为n,所以其实真正有效的数组长度为m+n 3、因此我们只需要在nums数组长度为m+n的区间内操作即可,两数组的数进行比较,大的数放进数组 4、注意while和if中的边界条件 |
|---|
哪个数组赋值给长数组了,就移动哪一个。
215. 数组中的第K个最大元素
//在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。class Solution {public int findKthLargest(int[] nums, int k) {for (int i = 1; i < nums.length; i++) {int index = i - 1;int indexValue = nums[i];while (index >= 0 && indexValue < nums[index]) {nums[index + 1] = nums[index];index--;}nums[index + 1] = indexValue;}int index = nums.length - k + 1;return nums[index];}}
此处使用插入排序算法,这道题主要就是考察排序算法,取第k个最大值无价值。
