理论:
Java 创建数组 :int[] a=new int[10]; 数据的基本特点: 支持随机访问 数组的关键:索引和寻址 数组在内存中是一段连续的的存储空间 时间复杂度:
实战
题目一链接:
思路:给的是有序数组,删除重复元素,最后结果还 要有序,并且 只能在本数组上进行修改,不能使用额外的数组来辅助。
这个题目的特征: 1.操作数组,并且要保证有序 2.元素有的要,有的 不要
所以 这种 类型 的题目就是要实现 一个保证有序的操作数组(保序的过滤器 )
保序模型代码:
class Solution {
public int removeDuplicates(int[] nums) {
int len =nums.length;
//用 n表示操作完成的数组的下标
int n=0;
for(int i=0;i<len;i++){
if(过滤){
//第i个元素若符合条件,就保留下来
nums[n]=n[i];
n++;
}
}
return n;
}
}
关键:不一样的题目要写不一样的过滤器 ,但是剩余部分 代码 是相同的。
本题的过滤器是:相邻元素不相等就保留
本题完整代码:
class Solution {
public int removeDuplicates(int[] nums) {
int len =nums.length;
//用 n表示操作完成的数组的下标
int n=0;
for(int i=0;i<len;i++){
if(i==0||nums[i]!=nums[i-1]){
//第i个元素若符合条件,就保留下来
nums[n]=nums[i];
n++;
}
}
return n;
}
}
注意点 :在数组题目 的 判断条件,要注意边界问题
题目二链接:
本题过滤器: 非零元素就 保存
本题 代码:
class Solution {
public void moveZeroes(int[] nums) {
int n=0;
for(int i=0;i<nums.length;i++){
if(nums[i]!=0){
nums[n] =nums[i];
n++;
}
}
while(n<nums.length){
nums[n]=0;
n++;
}
}
}
题解:首先筛选出非零元素,然后将剩余的位置全部赋值为0
代码 :
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int j=n-1;
int i=m-1;
for(int k=n+m-1;k>=0;k--){
//存 nums1【i】的
if(j<0||(i>=0&&nums1[i]>=nums2[j])){
nums1[k]=nums1[i];
i--;
}else{
nums1[k]=nums2[j];
j--;
}
}
}
}
题解: 本题是两个数组合并,并且不能使用新的数组来存储,要使用nums[1]数组,所以新的存储数组要从num1[i]的末尾开始进行, 本题的过滤器是 比较后存储num1[i]的元素