• 数组专题总结


    一、概述

    1、数组理论基础

    数组是存放在连续内存空间上的相同类型数据的集合。

    需要两点注意的是

    • 数组下标都是从0开始的。
    • 数组内存空间的地址是连续的

    正是因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。

    二、题型

    2.1 二分查找

    2.1.1二分查找

    704. 二分查找

    给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

    1. class Solution {
    2. public int search(int[] nums, int target) {
    3. int left=0,right=nums.length-1;
    4. while(left<=right)
    5. {
    6. int mid = (right+left)/2;
    7. //int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2
    8. if(nums[mid]
    9. left=mid+1;
    10. else if(nums[mid]>target)
    11. right = mid-1;
    12. else
    13. return mid;
    14. }
    15. return -1;
    16. }
    17. }

    2.2双指针

     2.2.1移除元素

    27. 移除元素

    给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

    1. class Solution {
    2. public int removeElement(int[] nums, int val) {
    3. int l = 0;
    4. for(int r =0;r
    5. if(nums[r] != val){
    6. nums[l++] = nums[r];
    7. }
    8. }
    9. return l;
    10. }
    11. }

    2.2.2 删除有序数组中的重复项

    26. 删除有序数组中的重复项

    给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

    1. class Solution {
    2. public int removeDuplicates(int[] nums) {
    3. if(nums.length == 0){
    4. return 0;
    5. }
    6. int left= 1;
    7. int right = 1;
    8. while(right
    9. if(nums[right]!=nums[right-1]){
    10. nums[left++]=nums[right];
    11. }
    12. right++;
    13. }
    14. return left;
    15. }
    16. }

    2.2.3移动零

    283. 移动零

    给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。

    1. class Solution {
    2. public void moveZeroes(int[] nums) {
    3. int j=0;
    4. for(int i=0;i
    5. if(nums[i]!=0)
    6. nums[j++]=nums[i];
    7. }
    8. for(;j
    9. nums[j]=0;
    10. }
    11. }

    2.2.4 比较含退格的字符串

    844. 比较含退格的字符串

    给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。注意:如果对空文本输入退格字符,文本继续为空。

    1. class Solution {
    2. public boolean backspaceCompare(String s, String t) {
    3. return convert(s).equals(convert(t));
    4. }
    5. public String convert(String str)
    6. {
    7. StringBuffer string = new StringBuffer();
    8. for(int i=0;i
    9. if(str.charAt(i)!='#')
    10. string.append(str.charAt(i));
    11. else if(string.length()>0)
    12. string.deleteCharAt(string.length()-1);
    13. }
    14. return string.toString();
    15. }
    16. }

    2.2.5 有序数组的平方

    977. 有序数组的平方

    给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

    1. class Solution {
    2. public int[] sortedSquares(int[] nums) {
    3. int len= nums.length;
    4. int ans[] =new int[len];
    5. for(int i=0,j=len-1,pos=len-1;i<=j;){
    6. if(nums[i]*nums[i]<=nums[j]*nums[j])
    7. {
    8. ans[pos--]=nums[j]*nums[j];
    9. j--;
    10. }
    11. else
    12. {
    13. ans[pos--]=nums[i]*nums[i];
    14. i++;
    15. }
    16. }
    17. return ans;
    18. }
    19. }

    2.2.6三数之和

    15. 三数之和

    2.2.7三数之和

    18. 四数之和

    2.3.滑动窗口

    2.3.1 长度最小子数组

    209. 长度最小的子数组

    给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

    1. class Solution {
    2. public int minSubArrayLen(int target, int[] nums) {
    3. int result =Integer.MAX_VALUE;
    4. int start=0,end=0,sum=0;
    5. for(;end
    6. sum=sum+nums[end];
    7. while(sum>=target){
    8. result = Math.min(result,end-start+1);
    9. sum-=nums[start++];
    10. }
    11. }
    12. return result==Integer.MAX_VALUE?0:result;
    13. }
    14. }

    2.3.2 最小覆盖子串

    76. 最小覆盖子串

    2.3.3 水果成蓝

  • 相关阅读:
    第十六章数据管理组织和角色期望4分
    51单片机-直流电机学习
    无法在 DLL“SQLite.Interop.dll”中找到名为”sIb4c632894b76cc1d“
    Spring Cloud Zookeeper 优雅下线优化
    宝宝入托,爸妈要避开这5种心态
    MyBatis的缓存
    Arduino esp8266 SerialEvent函数使用注意事项
    html div && span 容器元素
    阿里云混合云首席架构师张晓丹:政企混合云技术架构的演进和发展
    2024年AI助力研发:内容驱动下的全新变革与展望
  • 原文地址:https://blog.csdn.net/lalajh/article/details/126615828