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

个人网站的设计与实现毕业论文参考文献电商具体是做什么的

个人网站的设计与实现毕业论文参考文献,电商具体是做什么的,网站如何做网络推广,网站的设计思路范文交换一次的先前排列【LC1053】 给你一个正整数数组 arr(可能存在重复的元素),请你返回可在 一次交换(交换两数字 arr[i] 和 arr[j] 的位置)后得到的、按字典序排列小于 arr 的最大排列。 如果无法这么操作,…

交换一次的先前排列【LC1053】

给你一个正整数数组 arr(可能存在重复的元素),请你返回可在 一次交换(交换两数字 arr[i]arr[j] 的位置)后得到的、按字典序排列小于 arr 的最大排列。

如果无法这么操作,就请返回原数组。

虽然写出来了,但是花了55分钟…
还是有思路但是思路不清晰,然后直接敲代码,改来改去,老毛病了
笔试绝对ggg
看了别人的贪心,感觉自己笨笨的

  • 思路:贪心

    假设交换的左边元素为arr[i]arr[i]arr[i],右边的元素为arr[j]arr[j]arr[j]

    • 怎样交换一次可以使字典序减小?

      交换元素arr[i]>arr[j]arr[i]>arr[j]arr[i]>arr[j]时,可以使字典序较小,所以数组必须是非递增的

    • 如何使字典序小于原数组的情况下最大?【贪心】

      保留前面高位部分的数组,尽可能交换低位部分的数组,即尽可能最小化jjj的同时,最大化iii

      枚举每个右端点,此时的右端点rrr必须小于等于nums[j]nums[j]nums[j],找到在[i,r−1][i,r-1][i,r1]范围内,从右往左第一个大于其的左端点进行交换

      • 如果arr[r]>arr[j]arr[r] > arr[j]arr[r]>arr[j], 那么从右往左第一个大于arr[r]arr[r]arr[r]的左端点一定在i的左边包括i,那么我们无法获得比目前的排列更大的排列
      • 如果arr[r]==arr[j]arr[r] == arr[j]arr[r]==arr[j], 那么从右往左第一个大于arr[r]arr[r]arr[r]的左端点还是为iii,只需要修改右端点
      • 如果arr[r]<arr[j]arr[r] < arr[j]arr[r]<arr[j], 那么lll需要在[i+1,r−1][i+1,r-1][i+1,r1]的范围内才可能是字典序增大
  • 实现

    class Solution {public int[] prevPermOpt1(int[] arr) {int n = arr.length;int l = 0;// 升序数组本身就是最小排列while (l < n - 1 && arr[l] <= arr[l + 1]){l++;}if (l == n - 1) return arr; // 升序数组// 非升序数组 枚举每个右端点 找到从右往左第一个大于其的左端点进行交换// 之后交换的右端点必须小于等于arr[j],并且左端点l必须大于i才能使交换结果变小// 如果arr[r] > arr[j], 那么从右往左第一个大于arr[r]的左端点一定在i的左边包括i,那么我们无法获得比目前的排列更大的排列// 如果arr[r] == arr[j], 那么从右往左第一个大于arr[r]的左端点还是为i,只需要修改右端点// 如果arr[r] < arr[j], 那么l需要在[i+1,r-1]的范围内才可能是字典序增大int i = -1, j = -1;// 记录最终的交换结果for (int r = n - 1; r > i; r--){if (j != -1 && arr[r] > arr[j]) continue;if (j != -1 && arr[r] == arr[j]) {j = r;continue;}for (l = r - 1; l >= (i != -1 ? i + 1 : 0); l--){if (arr[l] > arr[r]){i = l;j = r;break;}}}// 交换int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;return arr;}
    }
    
    • 复杂度
      • 时间复杂度:O(n2)O(n^2)O(n2)
      • 空间复杂度:O(1)O(1)O(1)
  • 别人的贪心
    我们先从右到左遍历数组,找到第一个满足 arr[i−1]>arr[i]arr[i−1]>arr[i]arr[i1]>arr[i]的下标 iii,此时 arr[i−1]arr[i−1]arr[i1]就是我们要交换的数字,我们再从右到左遍历数组,找到第一个满足 arr[j]<arr[i−1]arr[j]<arr[i−1]arr[j]<arr[i1]arr[j]≠arr[j−1]arr[j] \neq arr[j - 1]arr[j]=arr[j1] 的下标 j,此时我们交换 arr[i−1]arr[i−1]arr[i1]arr[j]arr[j]arr[j] 后返回即可。

class Solution {public int[] prevPermOpt1(int[] arr) {int n = arr.length;for (int i = n - 1; i > 0; --i) {if (arr[i - 1] > arr[i]) {for (int j = n - 1; j > i - 1; --j) {if (arr[j] < arr[i - 1] && arr[j] != arr[j - 1]) {int t = arr[i - 1];arr[i - 1] = arr[j];arr[j] = t;return arr;}}}}return arr;}
}作者:ylb
链接:https://leetcode.cn/problems/previous-permutation-with-one-swap/solutions/2205403/python3javacgotypescript-yi-ti-yi-jie-ta-pxxt/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 复杂度
    • 时间复杂度:O(n)O(n)O(n)
    • 空间复杂度:O(1)O(1)O(1)
http://www.hkea.cn/news/566855/

相关文章:

  • 丰县住房与城乡建设部网站太原网站制作优化seo公司
  • 微信如何做微商城网站建设手机网站智能建站
  • 网站尾部分页数字怎么做推广app大全
  • 建筑设计软件有哪些优化网站建设
  • 网站开发 word文件预览医疗器械龙头股
  • 电子商务网站建设花费南宁百度seo排名价格
  • 做公司网站要注意哪些问题真正免费建站网站
  • 在线服务器代理杭州seo网络公司
  • wordpress邮件订阅seo技术外包
  • 深圳营销网站建站公司搜索引擎关键词的工具
  • 做网站如何网站考虑优化游戏推广员是诈骗吗
  • 公众号做视频网站吗关键词排名怎么做上首页
  • 重庆做网站价格优化软件下载
  • 如何做网站镜像今日最火的新闻
  • 水果网站开发所需的成本市场营销实际案例
  • 无锡市新吴区住房和建设交通局网站西安百度关键词包年
  • 网站平台方案设计seo上首页
  • 郑州做网站的联系方式搜狗友链交换
  • 一般建设一个网站多少钱怎么接广告赚钱
  • 计算机专业网站开发方向销售推广方案
  • 上海网站建设公司排名西安百度公司
  • 中国网网址是多少网站推广优化教程
  • 关于加强机关网站建设运营培训
  • dw做的网站怎么让别人看到如何建立一个网站
  • 保险网站建设优缺点seo代码优化步骤
  • 如何快速建网站百度电脑版入口
  • 山东省建设工程信息网站最近最新的新闻
  • 免费网站建设方案锦绣大地seo官网
  • 电子商务的网站建设牛排seo系统
  • 资源收费网站怎么做网站快速优化排名官网