JAVA整数数组中,找出其中两个数相加的和,并且找两个目标值的下标

阳光穿透心脏的1/2处 2023-06-17 09:58 115阅读 0赞
  1. package cn.datamasking.test.NumSum;
  2. import java.util.Arrays;
  3. import java.util.HashMap;
  4. public class Test {
  5. public static void main(String[] args) {
  6. /**
  7. * 查找字符串数组中是否包含指定的值
  8. */
  9. boolean resultStr = false;
  10. String[] arrStr = {"3", "2", "39", "6", "55", "13", "9"};
  11. String targetStr = "9";
  12. resultStr = Arrays.asList(arrStr).contains(targetStr);
  13. System.out.println(resultStr);
  14. /**
  15. * 整数数组中,找出其中两个数相加的和,并且找两个目标值的下标
  16. */
  17. int[] arrInt = {3, 2, 39, 6, 55, 13, 9};
  18. int targetInt = 9;
  19. int[] two3 = findTwoSum(arrInt, targetInt);
  20. for (int key : two3) {
  21. System.out.println(key);
  22. }
  23. /**
  24. * Arrays.binarySearch()方法只能用于有序数组!!!如果数组无序的话得到的结果就会很奇怪
  25. */
  26. long startTime = System.nanoTime();
  27. System.out.println(useArraysBinarySearch(arrStr,targetStr));
  28. long endTime = System.nanoTime();
  29. long duration = endTime - startTime;
  30. System.out.println("useArraysBinarySearch: " + duration / 1000000);
  31. /**
  32. * 使用循环判断
  33. */
  34. long startTime1 = System.nanoTime();
  35. System.out.println(useLoop(arrStr,targetStr));
  36. long endTime1 = System.nanoTime();
  37. long duration1 = endTime1 - startTime1;
  38. System.out.println("useLoop: " + duration1 / 1000000);
  39. }
  40. /**
  41. * 整数数组中,找出其中两个数相加的和等于目标值的下标
  42. */
  43. public static int[] findTwoSum(int[] arrs, int target) {
  44. // 结果数组
  45. int[] result = {-1, -1};
  46. // 目标是数组下标,所以键值对为<数值,数值对应数组下标>,这里要说一下,哈希表的查找的时间复杂度是O(1)
  47. HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
  48. // 1.扫描一遍数组,加入哈希表,时间复杂度是O(n)
  49. for (int i = 0; i < arrs.length; i++) {
  50. map.put(arrs[i], i);
  51. }
  52. // 2.第二次扫描,目标值-当前值,差值作为key,看看map里有木有,没有就下一个循环,直到数组扫描完毕或找到value,所以最坏情况的时间复杂度是O(n)
  53. for (int i = 0; i < arrs.length; i++) {
  54. // 得到第二个数的值
  55. int two = target - arrs[i];
  56. // 如果存在第二个数的数组下标&&结果的两个数不是同一个数的值
  57. if (map.containsKey(two) && target != 2 * two) {
  58. result[0] = i;
  59. result[1] = map.get(two);
  60. // 返回找到的两个数的数组下标
  61. return result;
  62. }
  63. }
  64. // 没有找到
  65. return result;
  66. }
  67. /**
  68. * 查找字符串数组中是否包含指定的值
  69. * * 时间复杂度劣于useLoop为:优
  70. */
  71. public static boolean useArraysBinarySearch(String[] arr, String targetValue) {
  72. int a = Arrays.binarySearch(arr, targetValue);
  73. if (a > 0)
  74. return true;
  75. else
  76. return false;
  77. }
  78. /**
  79. * 查找字符串数组中是否包含指定的值
  80. * 时间复杂度为:优
  81. */
  82. public static boolean useLoop(String[] arr, String targetValue) {
  83. for(String s: arr){
  84. if(s.equals(targetValue))
  85. return true;
  86. }
  87. return false;
  88. }
  89. }

发表评论

表情:
评论列表 (有 0 条评论,115人围观)

还没有评论,来说两句吧...

相关阅读