算法1-数组原理及其实战应用

204 阅读1分钟

理论:

Java 创建数组 :int[] a=new int[10]; 数据的基本特点: 支持随机访问 数组的关键:索引和寻址 数组在内存中是一段连续的的存储空间 时间复杂度:

图片.png

实战

题目一链接:

leetcode-cn.com/problems/re…

图片.png

思路:给的是有序数组,删除重复元素,最后结果还 要有序,并且 只能在本数组上进行修改,不能使用额外的数组来辅助。

这个题目的特征: 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;
    }
}

注意点 :在数组题目 的 判断条件,要注意边界问题

题目二链接:

leetcode-cn.com/problems/mo…

图片.png

本题过滤器: 非零元素就 保存

本题 代码:

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]的元素