2022-3-2 剑指offer day20

题1:

JZ11 旋转数组的最小数字

描述

有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。
 
数据范围:1 \le n \le 100001n10000,数组中任意元素的值: 0 \le val \le 100000val10000
要求:空间复杂度:O(1)O(1) ,时间复杂度:O(logn)O(logn)
 
 1 import java.util.ArrayList;
 2 public class Solution {
 3 //     public int minNumberInRotateArray(int [] array) {
 4 //         int ans=array[0];
 5 //         int i=1;
 6 //         while (i<array.length&&array[i]>=array[i-1]) i++;
 7 //         return i>=array.length?ans:array[i];
 8 //     }
 9     
10     
11     public int minNumberInRotateArray(int [] array) {
12        int l=0,r=array.length-1;
13         while (l<=r) {
14            int mid=(l+r)/2;
15            if (array[mid]>array[r]){
16                l=mid+1;
17            }else if (array[mid]<array[r]){
18                r=mid;
19            }else r--;
20         }
21         return array[l];
22     }
23     
24 
25 }

思路:二分或者直接遍历。

 

题2:

JZ38 字符串的排列

 

描述

输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。
例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。
数据范围:n < 10n<10
要求:空间复杂度 O(n!)O(n!),时间复杂度 O(n!)O(n!)
 

输入描述:

输入一个字符串,长度不超过10,字符只包括大小写字母。
 
 1 import java.util.*;
 2 public class Solution {
 3     ArrayList<String> ans;
 4     Set<String> set;
 5     public ArrayList<String> Permutation(String str) {
 6         char[] arr=str.toCharArray();
 7         boolean[] visited=new boolean[arr.length];
 8         ans=new ArrayList<>();
 9         set=new HashSet<>();
10         StringBuilder sb=new StringBuilder();
11         dfs(0,arr,sb,visited);
12         return ans;
13     }
14     
15     public void dfs(int n,char[] arr,StringBuilder sb,boolean[] v){
16         if (n==arr.length) {
17             if (!set.contains(sb.toString())){
18                 ans.add(sb.toString());
19                 set.add(sb.toString());
20             }
21             return;
22         }
23         for (int i=0;i<arr.length;i++) {
24             if (!v[i]) {
25                 sb.append(arr[i]);
26                 v[i]=true;
27                 dfs(n+1,arr,sb,v);
28                 sb.deleteCharAt(sb.length()-1);
29                 v[i]=false;
30             }
31         }
32     }
33     
34 }

思路:递归全排列,可能有重复字母,所以用set去重。

posted on 2022-03-02 09:37  阿ming  阅读(19)  评论(0编辑  收藏  举报

导航