算法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)即可完成排序,非常快
相关推荐
customer081 小时前
【开源免费】基于SpringBoot+Vue.JS体育馆管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
Miketutu2 小时前
Spring MVC消息转换器
java·spring
乔冠宇2 小时前
Java手写简单Merkle树
java·区块链·merkle树
利刃大大3 小时前
【回溯+剪枝】找出所有子集的异或总和再求和 && 全排列Ⅱ
c++·算法·深度优先·剪枝
LUCIAZZZ3 小时前
简单的SQL语句的快速复习
java·数据库·sql
komo莫莫da4 小时前
寒假刷题Day19
java·开发语言
Rachela_z4 小时前
代码随想录算法训练营第十四天| 二叉树2
数据结构·算法
细嗅蔷薇@4 小时前
迪杰斯特拉(Dijkstra)算法
数据结构·算法
追求源于热爱!4 小时前
记5(一元逻辑回归+线性分类器+多元逻辑回归
算法·机器学习·逻辑回归
ElseWhereR4 小时前
C++ 写一个简单的加减法计算器
开发语言·c++·算法