算法学习day01数组part01-704、27
package LeetCode.arraypart01; /** * 704.二分查找 * 给定一个n个元素有序的(升序)整型数组 nums 和一个目标值target ,写一个函数搜索 nums 中的 target, * 如果目标值存在返回下标,否则返回 -1。 */ /** * 思路:设定左右指针 * 找出中间位置,并判断该位置值是否等于 target * nums[mid] == target 则返回该位置下标 * nums[mid] > target 则右侧指针移到中间 * nums[mid] < target 则左侧指针移到中间 * 时间复杂度:O(logN) * 示例: * 输入: nums = [-1,0,3,5,9,12], target = 9 * 输出: 4 * 解释: 9 出现在 nums 中并且下标为 4 */ public class BinarySearch_704 { public static void main(String[] args) { int[] arr = {-1, 0, 3, 5, 9, 12}; int target = 3; int result = binary_search(arr, target); System.out.println(result); } public static int binary_search(int[] arr, int target) { int left = 0; int right = arr.length - 1; while (left <= right) { int mid = (left + right) / 2; if (arr[mid] == target) { return mid; } else if (arr[mid] > target) { right = mid - 1; } else { left = mid + 1; } } return -1; } }
package LeetCode.arraypart01; /** * 27. 移除元素 * 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 * 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 * 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 * */ /** * 双指针:快慢指针 * 简单梳理一下思路: * 数组的特点:数组中的元素只能覆盖,不能删除单个元素 * 1.设置两个指针,快指针for循环,当快指针指向的值不等于target时,将该元素赋值给慢指针指向的位置,慢指针往后移动 * 2.遇到目标值,快指针直接跳过,然后将下一个不是目标是的元素赋值到慢指针的位置上(慢指针此时在目标值上) * 3.循环结束之后,慢指针的位置就是新数组的长度 * 以上所有操作是在老数组的内存上完成的。 * 复杂度O(n) * * 暴力法是两次for循环完成操作 * */ public class RemoveElement_27 { public static void main(String[] args) { int [] arr = {1,2,3,3,4,5,6}; int target = 3; int result = remove_element(arr,target); System.out.println(result); } public static int remove_element(int [] arr,int val){ int slow = 0; for (int fast = 0; fast < arr.length; fast++) { if (arr[fast] != val){ arr[slow] = arr[fast]; slow++; } } return slow; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)