数组的插入删除(java)

1,144 阅读1分钟

数组

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

  • 数组在内存的的伪示例:

算法通关数组

Note

  • 数组下标都是从0开始的
  • 数组内存空间的地址是连续的 所以查找比较快 但是删除插入 比较慢

例如在下面数组中删除元素C

删除前

内存地址100101102103104105106
dataABCDEFG
下标0123456

删除后

内存地址100101102103104105106
dataABDEFGnull
下标0123456

binary search

// left Close  Right Close
public int search(int[] nums, int target) {
        if (nums.length <= 0) {
            return -1;
        }
        int left = 0;
    // because right is close so here right can use nums.length-1
        int right = nums.length - 1; 
    // here riht == left 
        while (left <= right) {
            int middle = left + (right - left) / 2;
            if (nums[middle] == target) {
                return middle;
            }

            if (nums[middle] > target) {
                right = middle - 1;
            } else {
                left = middle + 1;
            }
        }
        return -1;
    }
//Left Close Right Open
public int search(int[] nums, int target) {

        int left = 0;
        int right = nums.length; // because right is open so here right can use nums.length
        while (left < right) {
            int middle = left + (right - left) / 2;

            if (nums[middle] == target) {
                return middle;
            }

            if (nums[middle] > target) {
                right = middle;
            } else {
                left = middle + 1;
            }

        }

        return -1;
    }

search insert position

 public int searchInsert(int[] nums, int target) {
        final int length = nums.length;
        int left = 0;
        int right = length - 1;
        
        //default insert in the array right 
        
        int result = length;
        while (left <= right) {
            int middle = left + (right - left) / 2;
            if (target <= nums[middle]) {
                result = middle;
                right = middle - 1;
            } else {
                left = middle + 1;
            }
        }
        return result;
    }

remove element

public int removeElement(int[] nums, int target) {
        int left = 0;
        int right = nums.length;
        while (left < right) {
            if (nums[left] == target) {
                //right element direct replace left element 
                nums[left] = nums[right - 1];
                right--;
            } else {
                // loop next element 
                left++;
            }
        }
        return left;
    }
跟我一起学算法

代码随想录