LeetCode26. 删除有序数组中的重复项 27. 移除元素 35. 搜索插入位置 数组,双指针 二分查找

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

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k。去重后,返回唯一元素的数量 k

nums 的前 k 个元素应包含 排序后 的唯一数字。下标 k - 1 之后的剩余元素可以忽略。

具体代码:

package com.example.shuzu;

import org.junit.Test;

public class LeetCode26 {

    @Test
    public void test(){
        int[] nums = {0,0,1,1,1,2,2,3,3,4};

        System.out.printf(String.valueOf(removeDuplicates(nums)));
    }

    public int removeDuplicates(int[] nums) {

        if(nums.length ==0){
            return 0;
        }
        int index = 1;
        for (int i=1;i<nums.length;i++){
            if(nums[i] != nums[index-1]){
                nums[index] = nums[i];
                index++;
            }
        }
        return index;
    }
}

27. 移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

  • 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
  • 返回 k

具体代码:

package com.example.shuzu;

import org.junit.Test;


public class LeetCode27 {

    @Test
    public void test(){
        int[] nums = {3,2,2,3};
        int val = 3;
        System.out.printf(String.valueOf(removeElement(nums,val)));
    }

        public int removeElement(int[] nums, int val) {
            int index = 0;
            for(int i =0;i<nums.length;i++){
                if(nums[i] != val){
                    nums[index] = nums[i];
                    index++;
                }
            }
            return index;
        }

}

35.搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

package com.example.shuzu;

import org.junit.Test;

public class LeetCode35 {

    @Test
    public void test(){
        int[] nums = {1,3,5,6};
        int target = 5;
        System.out.printf(String.valueOf(searchInsert(nums,target)));
    }

    public int searchInsert(int[] nums, int target) {
        int n = nums.length;
        int left = 0,right = n-1,ans = n;
        while(left <= right){
            int mid = ((right - left) >>1) + left;
            if(target <= nums[mid]){
                ans=mid;
                right = mid - 1;
            }else{
                left = mid +1;
            }
        }
        return ans;
    }
}

 

posted @ 2025-12-24 11:12  雨花阁  阅读(6)  评论(0)    收藏  举报