首页 > 编程语言 >算法学习day05数组part扩展-69、35、34

算法学习day05数组part扩展-69、35、34

时间:2023-04-23 22:58:23浏览次数:56  
标签:target nums int day05 34 part 数组 public left

package LeetCode.arraypart01;
/**
 * 69. x 的平方根
 * 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
 * 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
 * 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
 * 示例:
 * 输入:x = 4
 * 输出:2
 * */

public class MySqrtX_69 {
    public static void main(String[] args) {
        int x = 9;
        int result = mySqrt(x);
        System.out.println(result);
    }
    public static int mySqrt(int x) {
        int left = 0, right = x, ans = -1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if ((long) mid * mid <= x) {
                ans = mid;
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return ans;
    }

}
package LeetCode.arraypart01;
/**
 * 35. 搜索插入位置
 * 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
 * 请必须使用时间复杂度为 O(log n) 的算法。
 */
public class SearchInsert_35 {
    public static void main(String[] args) {
        int [] arr = {1,3,5,7,9,11};
        int target = 12;
        int result = search_insert(arr,target);
        System.out.println(result);
    }
    /**
     * 暴力方法:
     * 时间复杂度:O(n)
     * 空间复杂度:O(1)
     */
    public static int search_insert_violence(int[] nums, int target) {
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] >= target) { // 一旦发现大于或者等于target的num[i],那么i就是我们要的结果
                return i;
            }
        }
        // 目标值在数组所有元素之后的情况,// 如果target是最大的,或者 nums为空,则返回nums的长度
        return nums.length;
    }

    /**
     * 二分法:
     * 时间复杂度:O(log n)
     * 空间复杂度:O(1)
     * */
    public static int search_insert(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] > target){
                right = mid - 1;
            }else {
                left = mid + 1;
            }
        }
        return right+1;
    }
}
package LeetCode.arraypart01;
/**
 * 34. 在排序数组中查找元素的第一个和最后一个位置
 * 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
 * 如果数组中不存在目标值 target,返回[-1, -1]。
 * 你必须设计并实现时间复杂度为 O(log n)的算法解决此问题。
 * 示例:
 * 输入:nums = [5,7,7,8,8,10], target = 8
 * 输出:[3,4]
 */

/**
 * 1.直观的思路肯定是从前往后遍历一遍。用两个变量记录第一次和最后一次遇见target 的下标,但这个方法的时间复杂度为
 *      O(n),没有利用到数组升序排列的条件。
 * 2.由于数组已经排序,因此整个数组是单调递增的,我们可以利用二分法来加速查找的过程
 * 考虑 target 开始和结束位置,其实我们要找的就是数组中「第一个等于 target 的位置」(记为leftIdx)
 *      和「第一个大于target 的位置减一」(记为rightIdx)。
 *
 * 二分查找中,寻找leftIdx 即为在数组中寻找第一个大于等于target 的下标,
 * 寻找rightIdx 即为在数组中寻找第一个大于target 的下标,然后将下标减一。
 * 两者的判断条件不同,为了代码的复用,
 *      我们定义 binarySearch(nums, target, lower) 表示在nums 数组中二分查找target 的位置,如果lower 为true,
 *      则查找第一个大于等于target 的下标,否则查找第一个大于target 的下标。
 * 最后,因为
 * target 可能不存在数组中,因此我们需要重新校验我们得到的两个下标
 * leftIdx 和 rightIdx,看是否符合条件,如果符合条件就返回[leftIdx,rightIdx],
 * 不符合就返回[−1,−1]。
 *
 * */

public class SearchRange_34 {
    public static void main(String[] args) {
        int[] arr = {5, 7, 7, 8, 8, 10};
        int target = 8;
        int[] result = search_range(arr, target);
        for (int i = 0; i < result.length; i++) {
            System.out.print(result[i] + " ");
        }
    }
    public static int[] search_range(int[] nums, int target) {
        int leftBorder = searchBorder(nums, target, true);
        int rightBorder = searchBorder(nums, target, false);
        return new int[]{leftBorder, rightBorder};
    }
    //传入true表示寻找左边界,传入false表示寻找右边界
    public static int searchBorder(int[] nums, int target, boolean flag){
        int left = 0;
        int right = nums.length - 1;
        int border = -1;
        while(left <= right){
            int mid = (right + left) / 2;
            if(nums[mid] > target){
                right = mid - 1;
            }else if(nums[mid] < target){
                left = mid + 1;
            }else{
                //true 寻找左边界
                if(flag){
                    right = mid - 1;
                }else{
                    left = mid + 1;
                }
                border = mid;
            }
        }
        return border;
    }
}

 

标签:target,nums,int,day05,34,part,数组,public,left
From: https://www.cnblogs.com/lipinbigdata/p/17348036.html

相关文章

  • codeforces 234C C. Weather(枚举+前缀后缀预处理)
    题目链接:codeforces234C题目大意:给出一个序列,问最少修改多少个元素,能保证前半截全是负数,后半截全是正数。题目分析:预处理出前缀中大于等于0的数的个数和后缀中小于等于0的数的个数。枚举每一个位置,判断以当前位置为分界点时需要修改的元素的个数。AC代码:#include<iostream>#inc......
  • Python partition使用技巧
    partition()方法用来根据指定的分隔符将字符串进行分割。如果字符串包含指定的分隔符,则返回一个3元的元组,第一个为分隔符左边的子串,第二个为分隔符本身,第三个为分隔符右边的子串。flask源代码的run模块中,出现的代码当做示例defrun():......_host='127.0.0.1'......
  • 从0开始写三维“软”引擎.part1 - 2013.7.13 - David Rousset
    I’dtoliketosharewithyouhowI’velearnedtobuildwhat’sknownasa“3Dsoftengine”throughaseriesoftutorials.“Softwareengine”meansthatwewilluseonlytheCPUtobuilda3Dengineinanoldschoolway(rememberDoomonyour80386?).I......
  • 算法学习day03链表part01-203、707、206--待办
    //这块需求重新进行学习packageLeetCode.linkedlistpart01;publicclassListNode{//结点的值intval;//下一个结点ListNodenext;//节点的构造函数(无参)publicListNode(){}//节点的构造函数(有一个参数)publicLis......
  • 34-同步时序电路设计步骤及序列检测器设计
    同步时序电路设计同步触发器翻转时间一致1.同步时序电路设计的一般步骤1.根据问题描述,确定原始的状态图或者是状态表2.状态化简,状态表中等效的可以合并3.状态分配,触发器的个数,状态如何分配,怎么将一组二进制数赋予不同的状态4.选择触发器(D,JK)5.确定激励方程组以及输......
  • 深入了解 Transformers – Part 1: 介绍 Transformer 模型
    动动发财的小手,点个赞吧!自从最新的LargeLanguageModels(LLaM)发布以来,如OpenAI的GPT系列、开源模型Bloom或谷歌发布的LaMDA等,Transformer展现出了巨大的潜力,成为了深度学习的前沿架构楷模。尽管已经有几篇文章介绍了transformer及其背后的数学原理,但在本文中,我想结合我认为最......
  • 算法学习day01数组part02-209、59、977
    packageLeetCode.arraypart02;/***209.长度最小的子数组*给定一个含有n个正整数的数组和一个正整数target。*找出该数组中满足其和≥target的长度最小的连续子数组[numsl,numsl+1,...,numsr-1,numsr],并返回其长度。如果不存在符合条件的子数组,返回0.*......
  • Approximation Theory and Method part 3
    ApproximationTheoryandMethodpart3BasicpropertiesofdivideddifferencesLet\(\left\{x_i;i=0,1,\ldots,n\right\}\)beany\((n+1)\)distinctpointsof\([a,b]\),andlet\(f\)beafunctionin\(\mathscr{C}[a,b]\).Thecoeffici......
  • 如何在 .NET Core WebApi 中处理 MultipartFormDataContent 中的文件
    在上一篇文章(如何在.NETCoreWebApi中处理MultipartFormDataContent)中,我们有描述过如何以最简单的方式在.NETCoreWebApi中处理MultipartFormDataContent。基于框架层面的封装,我们可以快速的从Request.Form中分别拿到文件内容和文本内容,但是这些默认的解析方式都是建......
  • CodeForces 34B Sale
    B- SaleTimeLimit:2000MS     MemoryLimit:262144KB     64bitIOFormat:%I64d&%I64uSubmit Status Practice CodeForces34BDescriptionOnceBobgottoasaleofoldTVsets.Therewere n TVsetsatthatsale.TVsetwithi......