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

广州网站建设论坛江门17年seo优化技术软件

广州网站建设论坛,江门17年seo优化技术软件,展厅设计收费标准,php网站建设思路977. 有序数组的平方 题目链接:977. 有序数组的平方 思路:双指针思想,数组是有序的且含有负数,其中元素的平方一定是两边最大。定义两个指针,从两端开始向中间靠近,每次比较两个指针的元素平方大小&#…

977. 有序数组的平方

题目链接:977. 有序数组的平方

思路:双指针思想,数组是有序的且含有负数,其中元素的平方一定是两边最大。定义两个指针,从两端开始向中间靠近,每次比较两个指针的元素平方大小,将较大的一个存入结果数组。(注意结果数组是从小到大的,所以要从后往前开始存入

时间复杂度:O(n),空间复杂度O(n)

class Solution {public int[] sortedSquares(int[] nums) {int n = nums.length;// 两个指针分别初始化在正负子数组绝对值最大的元素索引int i = 0, j = n - 1;// 得到的有序结果是降序的int p = n - 1;int[] res = new int[n];// 执行双指针合并有序数组的逻辑// 注意这里要i <= j,因为最后要处理两个元素while (i <= j) {if (Math.abs(nums[i]) > Math.abs(nums[j])) {res[p] = nums[i] * nums[i];i++;} else {res[p] = nums[j] * nums[j];j--;}p--;}return res;}
}

也可以使用for循环写法

public int[] sortedSquares(int[] nums) {int left = 0, right = nums.length - 1;int[] res = new int[nums.length];int p = res.length - 1;for (int i = 0; i < res.length; i++) {if (nums[left] * nums[left] > nums[right] * nums[right]){res[p] = nums[left] * nums[left];left++;}else {res[p] = nums[right] * nums[right];right--;}p--;}return res;
}

209. 长度最小的子数组

题目链接:209. 长度最小的子数组

思路:滑动窗口,两个指针代表窗口的左右边界,右边界一直遍历到最后,当窗口中元素和大于目标值的时候,更新结果,并且左边界往前走一步。(注意:这里一定是窗口右边界遍历一次,然后根据条件更新左边界。如果左边界作为遍历条件,一次循环是解不出来的。)

时间复杂度:O(n)

为什么时间复杂度是O(n) ?

不要以为双重while就是O(n^2)啊, 主要是看每一个元素被操作的次数,每个元素在滑动窗口进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 2 × n 也就是O(n)。

class Solution {public int minSubArrayLen(int target, int[] nums) {int i = 0;    // i代表窗口左边界int j = 0;    // j为窗口右边界int res = nums.length + 1;    // 定义结果为最大int total = 0;     // total存放窗口中元素和while (j < nums.length) {total = total + nums[j];j++;// 窗口中元素符合题意,更新结果,更新左边界和totalwhile (total >= target) {res = Math.min(res, j - i);total = total - nums[i];i++;}}return res == nums.length + 1 ? 0 : res;}
}

59. 螺旋矩阵II

题目链接:59. 螺旋矩阵II

思路:本题并不涉及什么算法,就是模拟过程,但却十分考察对代码的掌控能力。借用代码随想录中的图片容易理解。注意每次只需要改变二维数组行或列的坐标。

img

时间复杂度:O(n)

class Solution {public int[][] generateMatrix(int n) {int[][] matrix = new int[n][n];int upper_bound = 0, lower_bound = n - 1;int left_bound = 0, right_bound = n - 1;// 需要填入矩阵的数字int num = 1;while (num <= n * n) {if (upper_bound <= lower_bound) {// 在顶部从左向右遍历for (int j = left_bound; j <= right_bound; j++) {matrix[upper_bound][j] = num++;}// 上边界下移upper_bound++;}if (left_bound <= right_bound) {// 在右侧从上向下遍历for (int i = upper_bound; i <= lower_bound; i++) {matrix[i][right_bound] = num++;}// 右边界左移right_bound--;}if (upper_bound <= lower_bound) {// 在底部从右向左遍历for (int j = right_bound; j >= left_bound; j--) {matrix[lower_bound][j] = num++;}// 下边界上移lower_bound--;}if (left_bound <= right_bound) {// 在左侧从下向上遍历for (int i = lower_bound; i >= upper_bound; i--) {matrix[i][left_bound] = num++;}// 左边界右移left_bound++;}}return matrix;}
}

数组题目总结

数组的题目的主要解法有以下几种:

二分法

遇到有序数组,需要进行查找操作的时候,可以考虑二分法。

双指针法

双指针法里面比较重要的,是快慢指针法。当一个指针无法解题,或者需要使用一次循环完成两次循环里才能解决的问题时,需要考虑使用双指针。双指针的种类很多,滑动窗口也可以看作双指针法。

滑动窗口

滑动窗口是一种很巧妙的方法,可以不断的调节子序列的位置。当我们遇到需要查找符合条件的子序列时,可以考虑滑动窗口。

模拟行为

这种题目就是考察代码逻辑能力,但是要注意遵守循环不变量原则,二分法中也用到了循环不变量原则,其实就是保证循环过程中,定义的循环范围不要改变,例如:不要再一个开区间的循环中,做闭区间的循环操作,这样的代码逻辑十分混乱。

http://www.yayakq.cn/news/106775/

相关文章:

  • 新版爱美眉网站源码怎么删除创建的wordpress
  • 活动网站怎么建设未来 网站开发 知乎
  • 学习网站建设的书网络平台企业
  • 平顶山建设银行网站wordpress 博客实例
  • 大连中山区网站建设万网域名续费优惠
  • 做网站需要准备资料小门店做网站
  • 长沙城乡建设部网站首页制作购物网站教程
  • 网站开发软件开发114黄页公司
  • 网站推广和优化的原因网站建设实施文档
  • 石家庄网站开发设计登封网络推广
  • 台山网站建设公司兰州做网站 东方商易
  • 虚拟主机建设二个网站googleseo新手怎么做
  • 保定做网站多钱河南公司网站制作咨询
  • 家庭电脑做网站ASP个人网站的建设
  • 江川区住房和城乡建设局网站古风网站建设模板
  • 石家庄网站建设规划河北建设厅注册中心网站首页
  • 网站建设参考文献英文书籍做网站的s标的软件
  • 自己做儿童衣服教程的网站深圳互联网网站建设
  • 开发软件和做网站的区别桂林seo代排名
  • 温州外贸企业网站建设昆明小程序开发多少钱
  • 织梦网站如何转百度小程序同步小程序开发文档官网
  • 徐家汇网站建站长之家seo查询
  • 哈尔滨网站设计公司电话dw个人网页制作代码
  • 企业网站建设(信科网络)太原网站建设公司
  • 管理类网站开发价格wordpress添加微软雅黑
  • 网站建设策划怎么谈企业网站构建方案
  • 北京成立公司seo建设者
  • 福田网站建设设计wordpress3.8 中文标签
  • 山东网站建设团队王野天启鸿源
  • 网站策划app建设网站公司