算法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)即可完成排序,非常快
相关推荐
编程绿豆侠2 分钟前
力扣HOT100之栈:394. 字符串解码
java·算法·leetcode
朝朝又沐沐9 分钟前
基于算法竞赛的c++编程(18)string类细节问题
开发语言·c++·算法
hstar952718 分钟前
三十四、面向对象底层逻辑-SpringMVC九大组件之FlashMapManager接口设计哲学
java·spring·设计模式·架构
yuren_xia22 分钟前
Spring MVC执行流程简介
java·spring·mvc
记得早睡~34 分钟前
leetcode73-矩阵置零
数据结构·leetcode·矩阵
黄雪超1 小时前
JVM——对象模型:JVM对象的内部机制和存在方式是怎样的?
java·开发语言·jvm
凌冰_1 小时前
Tomcat 安装和配置
java·tomcat
一只叫煤球的猫1 小时前
虚拟线程生产事故复盘:警惕高性能背后的陷阱
java·后端·性能优化
爱coding的橙子1 小时前
每日算法刷题Day27 6.9:leetcode二分答案2道题,用时1h20min
算法·leetcode·职场和发展
GalaxyPokemon1 小时前
LeetCode - 3. 无重复字符的最长子串
算法·哈希算法·散列表