2022-3-24 剑指offer day41
题1:
JZ14 剪绳子
描述
给你一根长度为 n 的绳子,请把绳子剪成整数长的 m 段( m 、 n 都是整数, n > 1 并且 m > 1 , m <= n ),每段绳子的长度记为 k[1],...,k[m] 。请问 k[1]*k[2]*...*k[m] 可能的最大乘积是多少?例如,当绳子的长度是 8 时,我们把它剪成长度分别为 2、3、3 的三段,此时得到的最大乘积是 18 。
数据范围: 2 \le n \le 602≤n≤60
进阶:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n)
进阶:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n)
输入描述:
输入一个数n,意义见题面。
返回值描述:
输出答案。
1 public class Solution { 2 public int cutRope(int target) { 3 int max=0; 4 for (int i=2;i<=target;i++){ 5 int k=0,left=0; 6 if (target%i==0) k=target/i; 7 else { 8 k=target/i+1; 9 10 if (k*(i-1)>=target){ 11 k=target/i; 12 13 } 14 left=target-k*(i-1); 15 } 16 int s=1; 17 for (int j=0;j<i-1;j++) s*=k; 18 if (left!=0) s*=left; else s*=k; 19 max=Math.max(max,s); 20 21 } 22 return max; 23 } 24 }
思路:贪心。每一段越接近 越大。
题2:
JZ81 调整数组顺序使奇数位于偶数前面(二)
描述
输入一个长度为 n 整数数组,数组里面可能含有相同的元素,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,对奇数和奇数,偶数和偶数之间的相对位置不做要求,但是时间复杂度和空间复杂度必须如下要求。
数据范围:0 \le n \le 500000≤n≤50000,数组中每个数的值 0 \le val \le 100000≤val≤10000
要求:时间复杂度 O(n)O(n),空间复杂度 O(1)O(1)
1 import java.util.*; 2 3 4 public class Solution { 5 /** 6 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 7 * 8 * 9 * @param array int整型一维数组 10 * @return int整型一维数组 11 */ 12 public int[] reOrderArrayTwo (int[] array) { 13 // write code here 14 int l=0,r=array.length-1,n=array.length; 15 while (l<r) { 16 while (l<n&&array[l]%2==1) l++; 17 while (r>=0&&array[r]%2==0) r--; 18 if (l<r){ 19 int temp=array[l]; 20 array[l]=array[r]; 21 array[r]=temp; 22 l++; 23 r--; 24 } 25 26 } 27 return array; 28 } 29 }
思路:双指针 原地交换
浙公网安备 33010602011771号