算法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)即可完成排序,非常快
相关推荐
Theodore_10222 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
网易独家音乐人Mike Zhou2 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
冰帝海岸3 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象3 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了4 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·4 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic4 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王4 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康4 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神5 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式