首页 > 编程语言 >算法-数组

算法-数组

时间:2024-01-20 14:46:14浏览次数:34  
标签:target val nums int fast 算法 数组

1. 二分查找 (LeetCode 704)

题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

输入: nums = [-1,0,3,5,9,12], target = 9     
输出: 4       
解释: 9 出现在 nums 中并且下标为 4     

关键确定合法区间的形式
常见的有2种:

  • 左闭右闭
  • 左闭右开
// 左闭右闭的写法
// target!=nums[mid]的情况下,left和right都不需要再等于mid
class Solution {
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        int mid = (left + right) / 2;
        while (left <= right) {             //左闭右闭的定义下 left=right是合法的
            mid = (left + right) / 2;
            if (nums[mid] == target)
                return mid;
            else if (nums[mid] > target) {
                right = mid - 1;
            } else if (nums[mid] < target) {
                left = mid + 1;
            }
        }
        return -1;
    }
}

2. 删除元素(LeetCode 27)

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

2.1 暴力求解

两层for循环,每发现一个等于val的元素,就把它后面的元素依次往前移动一个位置。

// 暴力解法
class Solution {
    public int removeElement(int[] nums, int val) {
        int size = nums.length;
        for(int i = 0; i<size;++i){
            if(nums[i] == val){
                for(int j = i+1; j<size;++j){
                    nums[j-1] = nums[j];
                }
                size--;
                i--;
            }
        }
        return size;
    }
}

2.2 双指针

只需要O(n)的复杂度

  • slow指向新数组的下标
  • fast去扫一边数组,找到第一个不等于val的元素,用来填入新数组
class Solution {
    public int removeElement(int[] nums, int val) {
        int fast = 0;
        int slow = 0;
        for(fast = 0; fast < nums.length; ++fast){
            if(nums[fast] != val){
                nums[slow] = nums[fast];
                slow++;
            }
        }
        return slow;
    }
}

标签:target,val,nums,int,fast,算法,数组
From: https://www.cnblogs.com/hifrank/p/17976469

相关文章

  • leecode 189. 轮转数组
    Problem:189.轮转数组目录思路解题方法复杂度Code思路vocalO(1)的解法,太强了,完全想不到是咋想到的解题方法三次递归交换,太妙了复杂度时间复杂度:\(O(\frac{3}{2}n)\)空间复杂度:\(O(1)\)CodeclassSolution{public:voidchange(vector<int>&nums,i......
  • 贪心算法练习
    问题描述:设有n个正整数,将他们连接成一排,组成一个最大的多位整数。例如:n=4时,4个整数21,8,901,6连成的最大整数为:9018621。贪心选择策略:(1)将所有数字转化为字符串形式。(2)将所有字符串按照长度从大到小排序。如果长度相同,则按照字典序从大到小排序。(3)将排序后的字符......
  • 算法模板 v1.3.1.20240120
    算法模板v1.1.1.20240115:之前的历史版本已经不可寻,创建了第一份算法模板。v1.2.1.20240116:删除“编译”-“手动开栈”与“编译”-“手动开O优化”;将“编译”-“CF模板”中的第20行代码cin>>T;注释;删除“读写”及其目录下的内容;删除“图论”-“欧拉图”-“混合图”;删除“图论”-......
  • PacBio长read纠错算法的研究
    PacBio长read纠错算法的研究随着第三代测序技术的快速发展,长read测序技术的出现使得我们可以更好地理解基因组的结构和功能。PacBio是一种常用的长read测序技术,但是由于其测序错误率较高,需要进行纠错以提高准确性。本文将介绍PacBio长read纠错算法的研究进展。PacBio长read纠错......
  • 2024/1/19 算法笔记
    题目1:最大公约数的延伸问题P1414又是毕业季II-洛谷|计算机科学教育新生态(luogu.com.cn)题目上提及了最大公约数,但是解答却没有直接使用最大公约数doge题目意思是给定n个数,再给定一个k,往这n个数中取k个,求这k个数的最大公约数是多少?然后题目的要求是k的取值为1到n全部取......
  • 细说JavaScript数组(JavaScript数组详解)
    ![细说JavaScript数组(JavaScript详解)](https://img-blog.csdnimg.cn/direct/1f9f0b9905754c918bfc33f9d7565825.png#pic_center)一、理解数组数组不是一种独立的数据类型,它由对象发展而来,它可以使用对象的诸多方法,但又区别于对象。数组通常用来存储列表等信息,它就像一张电子表......
  • BZOJ1717 Milk Patterns 产奶的模式 (二分+后缀数组+height数组)
    发现这样起标题更能引流(ylg实锤了)题意给定一个长度为\(n\)的数组\(a\),求在\(a\)中出现了至少\(k\)次的最长子串的长度。解法考虑将一个子串拆成两个后缀,即\([l,r]=[l,n]-[r,n]\),发现一个长度为\(x\)的子串\(t\)在\(i,j\)两个位置出现过当且仅当后缀\(i,j\)有......
  • 吴师兄学算法day08 贪心 605. 种花问题
    题目:605.种花问题易错点:没想出来,借鉴了灵山的代码的思路,强行种花。我喜欢这个思路。感觉有点像设置哨兵那样的。 我的代码:classSolution:defcanPlaceFlowers(self,flowerbed:List[int],n:int)->bool:#修改数组,每次都种花,#凑够3个0......
  • 吴师兄学算法day08 贪心 860. 柠檬水找零
    题目:860.柠檬水找零易错点:我写的是ifesle哈哈,第一次还写错了。i==20的时候,5元只找了1张。哈哈哈.应该找3张 我的代码:classSolution:deflemonadeChange(self,bills:List[int])->bool:dic={5:0,10:0,20:0}foriinbills:......
  • MD4(SHA-1,SM3)算法的实现
     一、实验目的深度理解MD4(SHA-1,SM3)算法的工作原理,理解单向散列函数的应用,体会区块链挖矿的难度系数、加深对单向散列函数性质的理解。二、实验器材pycharm+python3.11三、实验内容1.实验要求:自己配置python环境,编写MD4(SHA-1,SM3)算法实现程序,运行MD4(SHA-1,SM3)程序,演......