04数组-移除元素

目录

LeetCode——35. 搜索插入位置

分析:

Code

LeetCode——34. 在排序数组中查找元素的第一个和最后一个位置

分析:

Code:


LeetCode——35. 搜索插入位置

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

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

示例 1:

输入: nums = [1,3,5,6], target = 5
输出: 2

示例 2:

输入: nums = [1,3,5,6], target = 2
输出: 1

示例 3:

输入: nums = [1,3,5,6], target = 7
输出: 4

提示:

  • 1 <= nums.length <= 104

  • -104 <= nums[i] <= 104

  • nums无重复元素升序 排列数组

  • -104 <= target <= 104

分析:

1.num为 无重复元素升序 排列数组,适合使用二分查找算法。

2.当目标值不存在于数组中的时候,需要区分边界值。

Code
class Solution {
    public int searchInsert(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        int mid  = -1;
        while(left <= right) {
            mid = left + ((right - left) >> 1); // 
            if (nums[mid] > target) {
                right = mid - 1;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else {
                return mid;
            }
        }
        return right+1;
    }
}
  • 时间复杂度:O(log n)

  • 空间复杂度:O(1)

LeetCode——34. 在排序数组中查找元素的第一个和最后一个位置

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例 1:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

示例 2:

输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]

示例 3:

输入:nums = [], target = 0
输出:[-1,-1]

提示:

  • 0 <= nums.length <= 105

  • -109 <= nums[i] <= 109

  • nums 是一个非递减数组

  • -109 <= target <= 109

分析:

寻找target在数组里的左右边界,有如下三种情况:

  • 情况一:target 在数组范围的右边或者左边,例如数组{3, 4, 5},target为2或者数组{3, 4, 5},target为6,此时应该返回{-1, -1}

  • 情况二:target 在数组范围中,且数组中不存在target,例如数组{3,6,7},target为5,此时应该返回{-1, -1}

  • 情况三:target 在数组范围中,且数组中存在target,例如数组{3,6,7},target为6,此时应该返回{1, 1}

Code:
class Solution {
    public int[] searchRange(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        int leftBoard = -1;
        int rightBoard = -1;
        while(left <= right) {
            int mid = left + ((right - left) >> 1);
            if (nums[mid] > target) {
                right = mid - 1;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else {
                leftBoard = mid;
                rightBoard = mid;
                // nums[leftBoard - 1]要注意左边界最小值
                while(leftBoard > 0 && nums[leftBoard] == nums[leftBoard - 1]){
                    leftBoard--;
                }
                // nums[rightBoard + 1]要注意右边界最大值
                if (nums[rightBoard] == nums[nums.length - 1]) {
                    rightBoard = nums.length - 1;
                } else {
                    while(rightBoard >= 0 && nums[rightBoard] == nums[rightBoard + 1]){
                        rightBoard++;
                    }
                }
                return new int[]{leftBoard, rightBoard};
            }
        }
        return new int[]{leftBoard, rightBoard};
    }
}
  • 时间复杂度:O(log n)

  • 空间复杂度:O(1)

好的,Java 事件处理是指通过监听用户的操作事件(如鼠标点击、键盘输入等),并在相应事件发生时执行一定的处理代码来响应用户的操作。下面是一个简单的 ATM 柜员机模拟程序,演示了 Java 事件处理的基本用法: ```java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ATM extends JFrame implements ActionListener { private JLabel label; private JButton button1, button2, button3; public ATM() { super("ATM"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300, 200); setLayout(new FlowLayout()); label = new JLabel("请选择操作:"); button1 = new JButton("查询余额"); button2 = new JButton("取款"); button3 = new JButton("存款"); add(label); add(button1); add(button2); add(button3); button1.addActionListener(this); button2.addActionListener(this); button3.addActionListener(this); } public void actionPerformed(ActionEvent e) { if (e.getSource() == button1) { label.setText("您的账户余额为1000元。"); } else if (e.getSource() == button2) { label.setText("请输入取款金额:"); } else if (e.getSource() == button3) { label.setText("请输入存款金额:"); } } public static void main(String[] args) { ATM atm = new ATM(); atm.setVisible(true); } } ``` 这个程序实现了一个简单的 ATM 柜员机界面,包含三个按钮:查询余额、取款、存款。当用户点击这些按钮时,程序会在标签中显示相应的信息。在构造函数中,我们设置了窗口的标题、大小和布局,并创建了标签和按钮,添加到窗口中。然后,我们为每个按钮添加了一个事件监听器,使用 this 关键字表示当前对象,即 ATM 类,在 actionPerformed 方法中根据事件源判断用户点击了哪个按钮,并在标签中显示相应的信息。最后在 main 方法中创建了一个 ATM 对象并显示出来。 这个示例程序虽然简单,但演示了 Java 事件处理的基本用法。在实际开发中,我们可以根据具体需求编写更加复杂的事件处理代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elaine202391

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值