当前位置: 首页 > news >正文

信誉比较好的网上做任务的网站汕头市网站建设公司

信誉比较好的网上做任务的网站,汕头市网站建设公司,企业做网站有用吗天涯,网站建设经费的请示题目 题目链接: https://www.nowcoder.com/practice/4af96fa010c44638a7e112abf65f7237 思路 贪心二分 所谓贪心,就是往死里贪,所以对于最大上升子序列,结尾元素越小,越有利于后面接上其他的数,也就可能变…

题目

在这里插入图片描述
题目链接:
https://www.nowcoder.com/practice/4af96fa010c44638a7e112abf65f7237

思路

贪心+二分

    所谓贪心,就是往死里贪,所以对于最大上升子序列,结尾元素越小,越有利于后面接上其他的数,也就可能变得更长所以贪心的做法是,建立一个dp数组,dp[i[表示长度为i的LIS结尾元素的最小值,因此我们只需要维护dp数组即可对于每一个数组的数,我们对他们进行判断,如果他大于等于dp[ans]的值,就把他放在数组后面,dp[++ans] = tr[i],否则,就在dp中去找大一个大于等于他的位置pos,dp[pos] = tr[i]。如果从头扫一遍数组,时间复杂度还是O(n^2),这与曹贼何异?!通过观察我们知道,这次维护的dp数组是单调递增的,所以就可以使出秘技二分之lower_bound来找pos的位置我们举个栗子:tr[] = 2 5 18 3 4 7 10 9 11 8 15dp[1] = 2;5大于2,所以dp[2] = 518大于5,所以dp[3] = 183小于18,所以二分去找,pos是2,所以dp[2] = 34小于18,所以二分去找,pos是3,所以dp[3] = 47大于4,所以dp[4] = 710大于7,所以dp[5] = 109小于10,所以二分去找,pos是5,dp[5] = 911大于9,所以dp[6] = 118小于11,所以二分去找,pos是5,dp[5] = 815大于11,所以dp[7] = 15所以最长上升子序列的长度为7注意:dp数组得到的不一定是真正的LIS比如:tr[] = 1 4 7 2 5 9 10 3得到的是1 2 3 9 10,而真正的LIS是1 2 5 9 10因此dp数组得到的不一定是真正的LIS,他只表示最长子序列长度的排好序的最小序列,对于最后一半将5换成3的意义是记录最小序列,便于后续数据的处理

Java代码

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** 该数组最长严格上升子序列的长度* @param a int整型一维数组 给定的数组* @return int整型*/public int LIS (int[] a) {//https://blog.csdn.net/weixin_51216553/article/details/114678534/*贪心+二分所谓贪心,就是往死里贪,所以对于最大上升子序列,结尾元素越小,越有利于后面接上其他的数,也就可能变得更长所以贪心的做法是,建立一个dp数组,dp[i[表示长度为i的LIS结尾元素的最小值,因此我们只需要维护dp数组即可对于每一个数组的数,我们对他们进行判断,如果他大于等于dp[ans]的值,就把他放在数组后面,dp[++ans] = tr[i],否则,就在dp中去找大一个大于等于他的位置pos,dp[pos] = tr[i]。如果从头扫一遍数组,时间复杂度还是O(n^2),这与曹贼何异?!通过观察我们知道,这次维护的dp数组是单调递增的,所以就可以使出秘技二分之lower_bound来找pos的位置我们举个栗子:tr[] = 2 5 18 3 4 7 10 9 11 8 15dp[1] = 2;5大于2,所以dp[2] = 518大于5,所以dp[3] = 183小于18,所以二分去找,pos是2,所以dp[2] = 34小于18,所以二分去找,pos是3,所以dp[3] = 47大于4,所以dp[4] = 710大于7,所以dp[5] = 109小于10,所以二分去找,pos是5,dp[5] = 911大于9,所以dp[6] = 118小于11,所以二分去找,pos是5,dp[5] = 815大于11,所以dp[7] = 15所以最长上升子序列的长度为7注意:dp数组得到的不一定是真正的LIS比如:tr[] = 1 4 7 2 5 9 10 3得到的是1 2 3 9 10,而真正的LIS是1 2 5 9 10因此dp数组得到的不一定是真正的LIS,他只表示最长子序列长度的排好序的最小序列,对于最后一半将5换成3的意义是记录最小序列,便于后续数据的处理*/int n = a.length;if (n <= 1) return n;int[] dp = new int[n + 1];int idx = 1;dp[idx] = a[0];// 利用贪心 + 二分查找进行更新for (int i = 1; i < n ; i++) {if (dp[idx] < a[i]) {idx++;dp[idx] = a[i];} else {int l = 1;int r = idx;int pos = 0;while (l <= r) {int mid = (l + r) >> 1;if (dp[mid] < a[i]) {pos = mid;l = mid + 1;} else {r = mid - 1;}}dp[pos + 1] = a[i];}}return idx;}
}

Go代码

package main/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** 该数组最长严格上升子序列的长度* @param a int整型一维数组 给定的数组* @return int整型*/
func LIS(a []int) int {//https://blog.csdn.net/weixin_51216553/article/details/114678534/*贪心+二分所谓贪心,就是往死里贪,所以对于最大上升子序列,结尾元素越小,越有利于后面接上其他的数,也就可能变得更长所以贪心的做法是,建立一个dp数组,dp[i[表示长度为i的LIS结尾元素的最小值,因此我们只需要维护dp数组即可对于每一个数组的数,我们对他们进行判断,如果他大于等于dp[ans]的值,就把他放在数组后面,dp[++ans] = tr[i],否则,就在dp中去找大一个大于等于他的位置pos,dp[pos] = tr[i]。如果从头扫一遍数组,时间复杂度还是O(n^2),这与曹贼何异?!通过观察我们知道,这次维护的dp数组是单调递增的,所以就可以使出秘技二分之lower_bound来找pos的位置我们举个栗子:tr[] = 2 5 18 3 4 7 10 9 11 8 15dp[1] = 2;5大于2,所以dp[2] = 518大于5,所以dp[3] = 183小于18,所以二分去找,pos是2,所以dp[2] = 34小于18,所以二分去找,pos是3,所以dp[3] = 47大于4,所以dp[4] = 710大于7,所以dp[5] = 109小于10,所以二分去找,pos是5,dp[5] = 911大于9,所以dp[6] = 118小于11,所以二分去找,pos是5,dp[5] = 815大于11,所以dp[7] = 15所以最长上升子序列的长度为7注意:dp数组得到的不一定是真正的LIS比如:tr[] = 1 4 7 2 5 9 10 3得到的是1 2 3 9 10,而真正的LIS是1 2 5 9 10因此dp数组得到的不一定是真正的LIS,他只表示最长子序列长度的排好序的最小序列,对于最后一半将5换成3的意义是记录最小序列,便于后续数据的处理*/n := len(a)if n <= 1 {return n}dp := make([]int, n+1)idx := 1dp[idx] = a[0]//利用贪心+二分查找进行更新for i := 1; i < n; i++ {if dp[idx] < a[i] {idx++dp[idx] = a[i]} else {l := 1r := idxpos := 0for l <= r {mid := (l + r) >> 1if dp[mid] < a[i] {pos = midl = mid + 1} else {r = mid - 1}}dp[pos+1] = a[i]}}return idx
}

PHP代码

<?php/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** 该数组最长严格上升子序列的长度* @param a int整型一维数组 给定的数组* @return int整型*/
function LIS( $a )
{//https://blog.csdn.net/weixin_51216553/article/details/114678534/*贪心+二分所谓贪心,就是往死里贪,所以对于最大上升子序列,结尾元素越小,越有利于后面接上其他的数,也就可能变得更长所以贪心的做法是,建立一个dp数组,dp[i[表示长度为i的LIS结尾元素的最小值,因此我们只需要维护dp数组即可对于每一个数组的数,我们对他们进行判断,如果他大于等于dp[ans]的值,就把他放在数组后面,dp[++ans] = tr[i],否则,就在dp中去找大一个大于等于他的位置pos,dp[pos] = tr[i]。如果从头扫一遍数组,时间复杂度还是O(n^2),这与曹贼何异?!通过观察我们知道,这次维护的dp数组是单调递增的,所以就可以使出秘技二分之lower_bound来找pos的位置我们举个栗子:tr[] = 2 5 18 3 4 7 10 9 11 8 15dp[1] = 2;5大于2,所以dp[2] = 518大于5,所以dp[3] = 183小于18,所以二分去找,pos是2,所以dp[2] = 34小于18,所以二分去找,pos是3,所以dp[3] = 47大于4,所以dp[4] = 710大于7,所以dp[5] = 109小于10,所以二分去找,pos是5,dp[5] = 911大于9,所以dp[6] = 118小于11,所以二分去找,pos是5,dp[5] = 815大于11,所以dp[7] = 15所以最长上升子序列的长度为7注意:dp数组得到的不一定是真正的LIS比如:tr[] = 1 4 7 2 5 9 10 3得到的是1 2 3 9 10,而真正的LIS是1 2 5 9 10因此dp数组得到的不一定是真正的LIS,他只表示最长子序列长度的排好序的最小序列,对于最后一半将5换成3的意义是记录最小序列,便于后续数据的处理*/$n = count($a);if($n<=1){return $n;}$dp =[0];$idx = 1;$dp[$idx] = $a[0];// 利用贪心 + 二分查找进行更新for($i=1;$i<$n;$i++){if($dp[$idx] <$a[$i]){$idx++;$dp[$idx] = $a[$i];}else{$l=1;$r =$idx;$pos=0;while ($l<=$r){$mid = ($l+$r) >>1;if($dp[$mid] <$a[$i]){$pos = $mid;$l=$mid+1;}else{$r = $mid-1;}}$dp[$pos+1] = $a[$i];}}return $idx;
}

C++代码

class Solution {public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** 该数组最长严格上升子序列的长度* @param a int整型vector 给定的数组* @return int整型*/int LIS(vector<int>& a) {//https://blog.csdn.net/weixin_51216553/article/details/114678534/*贪心+二分所谓贪心,就是往死里贪,所以对于最大上升子序列,结尾元素越小,越有利于后面接上其他的数,也就可能变得更长所以贪心的做法是,建立一个dp数组,dp[i[表示长度为i的LIS结尾元素的最小值,因此我们只需要维护dp数组即可对于每一个数组的数,我们对他们进行判断,如果他大于等于dp[ans]的值,就把他放在数组后面,dp[++ans] = tr[i],否则,就在dp中去找大一个大于等于他的位置pos,dp[pos] = tr[i]。如果从头扫一遍数组,时间复杂度还是O(n^2),这与曹贼何异?!通过观察我们知道,这次维护的dp数组是单调递增的,所以就可以使出秘技二分之lower_bound来找pos的位置我们举个栗子:tr[] = 2 5 18 3 4 7 10 9 11 8 15dp[1] = 2;5大于2,所以dp[2] = 518大于5,所以dp[3] = 183小于18,所以二分去找,pos是2,所以dp[2] = 34小于18,所以二分去找,pos是3,所以dp[3] = 47大于4,所以dp[4] = 710大于7,所以dp[5] = 109小于10,所以二分去找,pos是5,dp[5] = 911大于9,所以dp[6] = 118小于11,所以二分去找,pos是5,dp[5] = 815大于11,所以dp[7] = 15所以最长上升子序列的长度为7注意:dp数组得到的不一定是真正的LIS比如:tr[] = 1 4 7 2 5 9 10 3得到的是1 2 3 9 10,而真正的LIS是1 2 5 9 10因此dp数组得到的不一定是真正的LIS,他只表示最长子序列长度的排好序的最小序列,对于最后一半将5换成3的意义是记录最小序列,便于后续数据的处理*/int n = a.size();if (n <= 1) {return n;}vector<int> dp(n + 1, 0);int idx = 1;dp[idx] = a[0];// 利用贪心 + 二分查找进行更新for (int i = 1; i < n; i++) {if (dp[idx] < a[i]) {dp[++idx] = a[i];} else {int l = 1;int r = idx;int pos = 0;while (l <= r) {int mid = (l + r) >> 1;if (dp[mid] < a[i]) {pos = mid;l = mid + 1;} else {r = mid - 1;}}dp[pos + 1] = a[i];}}return idx;}
};
http://www.yayakq.cn/news/720514/

相关文章:

  • cpa没有网站怎么做台州做网站的公司
  • logo设计网站免费无水印企业营销的网站
  • 北京建商城网站怎样开发手机网站建设
  • 提供东莞微信网站建设安微省住房和城乡建设厅网站
  • 一般网站建设多少钱要做一个网站得怎么做
  • 保定涿州网站建设浙江省网站建设公司
  • 无锡大型网站建设公司专业做网站报价
  • 网站内页全是404请别人做网站注意事项
  • 张家港网站设计建设安平做网站
  • 用手机做兼职的网站wordpress火车头采集
  • 校园网站建设方向网站新闻列表页面代码
  • 做门户网站预算中国网络经纪人
  • 长沙制作网站商品展示网站源码
  • extjs网站开发福州网站开发私人
  • 长沙做网站需要多少钱企业微信公众号平台官网
  • 中国蔬菜网网站建设电话中国制造货源网一件代发
  • 娃哈哈网站建设的目标wordpress无法修改文章
  • 东城网站设计泰州外贸网站建设
  • 找人做网站去哪里找比较好的公文写作网站
  • wordpress 底部美化宁波优化seo软件公司
  • 山东省建设人才网站上海网络推广软件
  • 网站开发报价和开发周期简单建设网站
  • 网站网页制作公司网站以前做视频的网站
  • 网站提交搜索引擎后出现问题网店装修定制
  • 上海网站建设设如何做简单的网站
  • asp响应式h5网站源码it行业有哪些职业
  • 网站设计制作中心重庆网站建站系统
  • 教做幼儿菜谱菜的网站国展网站建设
  • 网站app免费制作软件网站开发 项目职责
  • 做网站外包需要提供什么适合在家做的电商