数组分割求解
题目特点
- 有序递增或者和顺序有关
例1、题目描述
一、 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
输入:nums = [2,7,11,15], target = 9
输出:[2,7] 或者 [7,2]
例2、题目描述
二、题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
解题思路
建立头指针left=0和尾指针right=数组长度-1,作为数组下标使用
循环判断条件/结束条件:
从两侧向中间走,left < right
if判断条件:
对当前指针指向的元素做定向判断(依据题目要求><=,奇偶)
返回return:
满足条件的当前指向值
例题一
package com.vetor.vetor;
public class Solution {
public static int[] twoSum(int[] nums,int target) {
//定义头指针
int left = 0;
//定义尾指针
int right = nums.length - 1;
//移动left和right,直到left在right右侧或者相遇为止
while(left<right)
{
//计算此时两个指针指向的元素之和
int sum = nums[left]+nums[right];
//如果这两个元素值之和小于目标值target
if(sum<target)
{
//由于数组是递增排序的数组
//所以需要去找更大的数,那left向右移动
left++;
}else if(sum >target) {
//由于数组是递增排序的数组
//所以需要去找更小的数,那right向左移动
right--;
}else { //相等时,说明找到了
//返回这对元素
return new int[] {nums[left],nums[right]};
}
}
//否则说明没有知道
return new int[0];
}
public static void main(String[] args) {
int[] nums = new int[5];
for(int i = 0;i <nums.length; i++)
nums[i] = i+1;
int target = 5;
int[] result = twoSum(nums,target);
for(int i = 0;i <result.length;i++)
System.out.print(result[i]+" ");
}
}
测试结果
例题2
package com.vetor.vetor;
public class test2 {
public static int[] exchange(int[] nums)
{
//定义头指针
int left=0;
//定义尾指针
int right = nums.length -1;
//借助一个第三者变量tmp进行交换
int tmp = 0;
while(left < right)
{
//这里为何一定要left<right再写一次呢???
/**
* 必须要进行更新判断,left,right
* 因为每次执行if后left,right值是有可能会变化
* 而执行语句是有顺序的,可能会对下一条语句原来的意思改变了
*/
if(left < right&&nums[left]%2==1) //是奇数,不需交换
{
left++; //继续判断下一个
}
if(left < right&&nums[right]%2==0) //是偶数,不需交换
{
right--; //继续判断前一个
}
//否则,进行交换
/**
* 误区:
* left++;
* 与
* right--;
* 是在符合if条件时才进行的运算
* 而不符合的就不会进行运算,那么仍旧为当前的
* left,right值进行交换就可以了
*/
tmp = nums[left];
nums[left]=nums[right];
nums[right]=tmp;
}
return nums; //返回结果
}
public static void main(String[] args) {
int[] nums = {1,2,3,4};
int[] numss = exchange(nums);
for(int i = 0;i<numss.length;i++)
{
System.out.print(numss[i]+" ");
}
}
}
测试结果
学习总结
先多自己写一下思路,然后按照自己的想法去实现算法,遇到问题再对比算法模板学习