leetcode 977.有序数组的平方 java

题目:给定一个非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按照非递减顺序排序

解题方法:直接排序、双指针(归并方法)、双指针

一、直接排序

          直接将数组nnums中的元素平方后排序。

public class Solution {
		public static int[] sortSquares(int[] nums) {
			int[] result = new int[nums.length];
			for(int i = 0;i < nums.length;i++) {
				result[i] = nums[i]*nums[i];
			}
			Arrays.sort(result);
			return result;
		}

二、双指针(归并方法)

        找到数组nums中负数与非负数的分界线,设为mid。nums[0]到nums[mid]均为负数,nums[mid+1]到nums[length-1]非负数。可以使用归并的方法进行排序。

        使用两个指针分别指向位置mid、mid+1,每次比较两个指针位置的元素平方值,将较小的值放入答案数组,并更新指针。当某一个指针移动至边界时,将另一个指针还未遍历到的元素放入答案数组中。

public class Solution {
		public static int[] sortSquares(int[] nums) {
			int[] ans = new int[nums.length];//定义答案数组
			int mid = -1;
			//寻找分界线
			for(int i = 0; i<nums.length; i++) {
				if(nums[i] < 0) {
					mid = i;
				}else {
					break;
				}
			}
			int index = 0, i = mid, j = mid + 1;
			while(i >= 0 || j < nums.length) {
				if(i < 0) {
					ans[index] = nums[j]*nums[j];
					j++;
				}else if(j == nums.length) {
					ans[index] = nums[i]*nums[i];
					i--;
				}else if(nums[i]*nums[i] > nums[j]*nums[j]) {
					ans[index] = nums[j]*nums[j];
					j++;
				}else {
					ans[index] = nums[i]*nums[i];
					i--;
				}
				index++;
			}
			return ans;
			
		}

三、双向指针

        分别将两个指针指向位置0和n-1,每次比较两个指针指向的元素,选择较大的元素逆序放入答案数组ans[],直至两个指针指向同一个位置。

public class Solution {
		public static int[] sortSquares(int[] nums) {
			int left = 0, right = nums.length-1;
			int[] ans = new int[nums.length];//定义答案数组
			int index = nums.length-1;
		    while(left <= right) {
		    	if(nums[left]*nums[left] > nums[right]*nums[right]) {
		    		ans[index] = nums[left]*nums[left];
		    		++left;
		    	}else {
		    		ans[index] = nums[right]*nums[right];
		    		right--;
		    	}
		    	--index;
		    }
			return ans;
		}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值