天天看點

數組相關題(java)

目錄

最長重複數組

子數組最大累加和

滑動視窗最大值

找出最大索引的山峰

最長重複數組

數組相關題(java)

 嘗試使用雙指針周遊,但無法保證子數組最長;檢視題解發現使用hashmap解題最優,定義左邊界,子數組長度初始值,然後周遊數組,将數組元素記載在hashmap中,并更新長度值;每次周遊新元素判斷hashmap是否包含此元素,如包含将左邊界放置目前元素,不包含則記錄後繼續周遊

import java.util.*;


public class Solution {
    /**
     * 
     * @param arr int整型一維數組 the array
     * @return int整型
     定義Hashmap存儲  無重複元素後移繼續存放  記錄并取長度最大值
     發現元素重複重置左指針,然後繼續對比
     */
    public int maxLength (int[] arr) {
        // write code here
        HashMap<Integer,Integer> map = new HashMap<>();
        int left = 0, len = 0;
        for(int i = 0; i < arr.length; i++){
            if(map.containsKey(arr[i])){
                left = Math.max(left,map.get(arr[i]) + 1);
               
            }
            len = Math.max(len, i - left +1);
            map.put(arr[i],i);
        }
        return len;
    }
}
           

子數組最大累加和

限定數組中元素不能全為負值

數組相關題(java)

貪心算法,定義sum,max指向arr[0]初始值;周遊數組,每次移動取sum加上目前元素與目前元素的最大值,對比sum與max記錄最大值然後繼續周遊;

輸出其子數組

private static ArrayList<Integer> findMax(int[] arr) {
        int sum = arr[0];
        ArrayList<Integer> list = new ArrayList<>();

        for (int i = 1; i < arr.length; i++) {
            //取目前和與加上i處元素最大值
            sum += arr[i];
            if (sum > arr[i]){
                list.add(arr[i - 1]);
            }else {
                list.removeAll(list);
                sum = arr[i];
            }
        }
            return list;
    }
           

定義sum值等于索引0的值,初始化子數組;

周遊父數組,sum累加元素,然後判斷sum+arr[i] 與 arr[i],大小;如sum+arr[i] > arr[i],說明應該将該元素加入子數組,如sum+arr[i] <= arr[i],則清空子數組,并将sum指派為arr[i](相當于重置操作),然後繼續周遊    正如賭徒心理,當輸的比較多時,隻想重新來過

滑動視窗最大值

數組相關題(java)

 定義左右指針求解,左指針置于起始點,右指針置于滑動視窗末端(size - 1);

在視窗中周遊求最大值并插入list,然後左右指針同時右移,判斷右指針是否到達數組邊界,然後繼續下一步操作;最後傳回list;(注意邊界問題,視窗長度為0時直接傳回空值;

import java.util.*;
public class Solution {
    public ArrayList<Integer> maxInWindows(int [] num, int size) {
         ArrayList list = new ArrayList();
        if(num.length == 0 || size < 1 || size > num.length)  return list;
        int left = 0, right = size - 1;
       
        while(right < num.length){
            int max = num[left];
        for(int i = left; i <= right; i++){
            if(max < num[i]){
                max = num[i];
            }
        }
            left += 1;
            right += 1;
            list.add(max);
        }
        return list;
    }
}
           

找出最大索引的山峰

數組相關題(java)
import java.util.*;


public class Solution {
    /**
     * 尋找最後的山峰
     * @param a int整型一維數組 
     * @return int整型
     要求的是最大索引的山峰,采用倒序,找到第一個山峰就輸出
     */
    public int solve (int[] a) {
        // write code here
        int n = a.length - 1;
        for(int i = n; i > 0; i--){
            if(a[i] >= a[i - 1]){
                return i;
            }
        }
        
        return -1;
    }
}
           

數組中隻出現一次的數(其它數出現k次)_牛客題霸_牛客網

數組相關題(java)

使用位運算解題最簡便 

import java.util.*;


public class Solution {
    /**
     * 代碼中的類名、方法名、參數名已經指定,請勿修改,直接傳回方法規定的值即可
     *
     * 
     * @param arr int一維數組 
     * @param k int 
     * @return int
     */
    public int foundOnceNumber (int[] arr, int k) {
        // write code here int數組是4位元組,32位存儲,是以定義32長度的數組表示元素二進制
        int[] num = new int[32];
        int res= 0;
        for(int i = 0; i < 32; i++){
            int temp = 0;
//             求二進制數組每一位的和(不斷與1進行運算)
            for(int n : arr){
                temp += (n >> i & 1);
            }
            //如二進制數組目前位的總和與k取餘不等于0(即出現的不是k次,根據題意必是1次)
            if(temp % k != 0){
//                 将此二進制位下的元素左移恢複
                res += 1 << i;
            }
        }
        return res;
    }
}
           

繼續閱讀