算法Day1|704-二分查找;27-移除元素;977-有序数组的平方

前言

今天是数组刷题,尽管看着都是简单的题,且之前刷过几次,但是还是耗时接近2小时。

  • 704-二分查找:2024-10-16 通过
  • 27-移除元素:2024-10-16 通过
  • 977-有序数组的平方:2024-10-16 通过

1、题目1:704-二分查找

题目链接:leetcode.cn/problems/bi...

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

示例 1:

makefile 复制代码
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

示例 2:

makefile 复制代码
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

代码:

sql 复制代码
public class Number_704 {

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

    public static void main(String[] args) {
        int[] ints = {-1, 0, 3, 5, 9, 12};
        int search = search(ints, 9);
        System.out.println(search);
    }
}

思路小结:

  • 记住一种常用的写法即可,while(left <= right),然后 mid+1 和 mid-1
  • Mid 计算不越界

2、题目2:27-移除元素

题目链接:leetcode.cn/problems/re...

难度:简单

题目

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

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

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

思路

  • 原地删除元素可以考虑双指针法,而且是快慢指针
  • Slow 的值就是不相等的个数,默认是0开始计算

代码:

ini 复制代码
public class Number_27 {
    public static void main(String[] args) {
        int[] ints = {0,1,2,2,3,0,4,2};
        int search = removeElement(ints, 2);
        System.out.println(search);
    }

    public static int removeElement(int[] nums, int val) {
        int slow =0;
        for (int fast = 0; fast < nums.length; fast++) {
            if(nums[fast] != val){
                // 将等于 val 的元素都移动到最后面
nums[slow++] = nums[fast];
            }
        }
        return slow;
    }
}

3、题目3:977-有序数组的平方

题目链接:leetcode.cn/problems/sq...

难度:简单

题目:

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

ini 复制代码
示例 1:
输入: nums = [-4,-1,0,3,10]
输出: [0,1,9,16,100]

解释: 平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]

示例 2:
输入: nums = [-7,-3,2,3,11]
输出: [4,9,9,49,121]

思路

  • 数组的常用解法就是双指针,这题也可以用到,一头一尾指针

  • 通过比较头指针和尾指针的大小,可以得到一个最大值(非递减顺序排序的)。

  • 初始化一个数组,依次往最后一个位置插入元素

代码

ini 复制代码
public class Number_977 {
    public static void main(String[] args) {
        int[] nums ={-4,-1,0,3,10};
        int[] ints = sortedSquares(nums);
        for (int i : ints) {
            System.out.println(i);
        }
    }

    public static int[] sortedSquares(int[] nums) {
        int[] result = new int[nums.length];
        int index= nums.length-1;
        int slow = 0;
        int fast = nums.length -1;
        while (slow <= fast) {
            int slowval = nums[slow]* nums[slow];
            int fastval = nums[fast]* nums[fast];
            if(slowval < fastval){
                fast--;
                result[index--] = fastval;
            }else{
                slow++;
                result[index--] = slowval;
            }
        }
        return result;
    }
}

其他思路想法:

  • 采用提供的工具 Arrays.sort(nums)即可完成排序,非常快
相关推荐
codingPower3 分钟前
IDEA接入阿里云百炼中免费的通义千问[2025版]
java·阿里云·intellij-idea
JouJz26 分钟前
Java基础系列:深入解析反射机制与代理模式及避坑指南
java·开发语言·代理模式
小安同学iter28 分钟前
Spring(七)AOP-代理模式
java·后端·spring
Dante79831 分钟前
【数据结构】二叉搜索树、平衡搜索树、红黑树
数据结构·c++·算法
鸽鸽程序猿1 小时前
【JavaEE】SpringIoC与SpringDI
java·开发语言·java-ee
驼驼学编程1 小时前
决策树,Laplace 剪枝与感知机
算法·决策树·剪枝
坚强小葵1 小时前
实验8-2-1 找最小的字符串
c语言·算法
apcipot_rain1 小时前
【密码学——基础理论与应用】李子臣编著 第三章 分组密码 课后习题
python·算法·密码学
Yuanymoon1 小时前
【由技及道】API契约的量子纠缠术:响应封装的十一维通信协议【人工智障AI2077的开发日志012】
java·架构设计·spirng